diff --git a/.nvmrc b/.nvmrc index dbadd72fe8cac..f0fcab7c9b936 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v6.11.2 +v6.11.5 diff --git a/Dockerfile b/Dockerfile index 6780681fb34a3..3b1082b839b66 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:6.11.2 +FROM node:6.11.5 MAINTAINER Automattic WORKDIR /calypso diff --git a/assets/stylesheets/_components.scss b/assets/stylesheets/_components.scss index 11068deeb5f62..cd06ff879476d 100644 --- a/assets/stylesheets/_components.scss +++ b/assets/stylesheets/_components.scss @@ -32,6 +32,7 @@ @import 'blocks/comment-detail/style'; @import 'blocks/comments/style'; @import 'blocks/conversation-caterpillar/style'; +@import 'blocks/conversation-follow-button/style'; @import 'blocks/conversations/style'; @import 'blocks/daily-post-button/style'; @import 'blocks/disconnect-jetpack/style'; @@ -97,8 +98,10 @@ @import 'components/domains/domain-product-price/style'; @import 'components/domains/domain-search-results/style'; @import 'components/domains/domain-suggestion/style'; +@import 'components/domains/domain-transfer-suggestion/style'; @import 'components/domains/example-domain-suggestions/style'; @import 'components/domains/map-domain-step/style'; +@import 'components/domains/transfer-domain-step/style'; @import 'components/domains/register-domain-step/style'; @import 'components/domains/registrant-extra-info/style'; @import 'components/drop-zone/style'; @@ -386,6 +389,10 @@ @import 'my-sites/sidebar/style'; @import 'my-sites/sidebar-navigation/style'; @import 'my-sites/site-indicator/style'; +@import 'my-sites/site-settings/jetpack-credentials/style'; +@import 'my-sites/site-settings/jetpack-credentials/credentials-configured/style'; +@import 'my-sites/site-settings/jetpack-credentials/credentials-form/style'; +@import 'my-sites/site-settings/jetpack-credentials/credentials-setup-flow/style'; @import 'my-sites/importer/style'; @import 'blocks/site/style'; @import 'my-sites/sites/style'; diff --git a/assets/stylesheets/shared/_color-schemes.scss b/assets/stylesheets/shared/_color-schemes.scss index 110e8d209406c..e68e2d6b078c9 100644 --- a/assets/stylesheets/shared/_color-schemes.scss +++ b/assets/stylesheets/shared/_color-schemes.scss @@ -1,30 +1,45 @@ //default color scheme :root { --masterbar-color: $white; - --masterbar-background-color: $blue-wordpress; + --masterbar-background: $blue-wordpress; --masterbar-border-color: darken( $blue-wordpress, 4% ); --masterbar-item-hover-background: lighten( $blue-wordpress, 5% ); --masterbar-item-active-background: darken( $blue-wordpress, 17% ); --masterbar-item-new-color: $blue-wordpress; + --masterbar-item-new-editor-background: darken( $blue-wordpress, 17% ); + --masterbar-item-new-editor-hover-background: darken( $blue-wordpress, 13% ); + --masterbar-toggle-drafts-editor-background: darken( $blue-wordpress, 12% ); + --masterbar-toggle-drafts-editor-border-color: darken( $blue-wordpress, 5% ); + --masterbar-toggle-drafts-editor-hover-background: darken( $blue-wordpress, 17% ); } //additional color schemes .color-scheme { &.is-light { --masterbar-color: $gray-text; - --masterbar-background-color: lighten( $gray, 20% ); + --masterbar-background: lighten( $gray, 20% ); --masterbar-border-color: lighten( $gray, 10% ); --masterbar-item-hover-background: lighten( $gray, 30% ); --masterbar-item-active-background: lighten( $gray, 10% ); --masterbar-item-new-color: $gray-text; + --masterbar-item-new-editor-background: darken( $gray, 20% ); + --masterbar-item-new-editor-hover-background: darken( $gray, 10% ); + --masterbar-toggle-drafts-editor-background: darken( $gray, 10% ); + --masterbar-toggle-drafts-editor-border-color: lighten( $gray, 20% ); + --masterbar-toggle-drafts-editor-hover-background: darken( $gray, 10% ); } &.is-dark { --masterbar-color: $white; - --masterbar-background-color: $gray-dark; + --masterbar-background: $gray-dark; --masterbar-border-color: darken( $gray, 10% ); --masterbar-item-hover-background: darken( $gray, 10% ); --masterbar-item-active-background: $gray-text-min; --masterbar-item-new-color: $gray-dark; + --masterbar-item-new-editor-background: $gray-text-min; + --masterbar-item-new-editor-hover-background: lighten( $gray-text-min, 5% ); + --masterbar-toggle-drafts-editor-background: darken( $gray, 10% ); + --masterbar-toggle-drafts-editor-border-color: $gray-dark; + --masterbar-toggle-drafts-editor-hover-background: lighten( $gray-text-min, 5% ); } } diff --git a/bin/codemods/README.md b/bin/codemods/README.md index 1e0a0336222df..1507953af68db 100644 --- a/bin/codemods/README.md +++ b/bin/codemods/README.md @@ -4,6 +4,30 @@ Code modification scripts, also known as codemods, are transformation scripts that can simultaneously modify multiple files with precision and reliability. Codemods were popularized by [Facebook's engineering team](https://medium.com/@cpojer/effective-javascript-codemods-5a6686bb46fb) and depends greatly on Facebook's [jscodeshift](https://github.com/facebook/jscodeshift) library, which wraps over a library named [recast](https://github.com/benjamn/recast) (author of which is associated with the [Meteor](https://www.meteor.com/) project). +## How to write codemods + +Place your codemod under `src` folder: +```bash +touch ./bin/codemods/src/your-transformation-name.js +``` + +Here's a stub to begin with: +```js +const config = require( './config' ); + +export default function transformer( file, api ) { + const j = api.jscodeshift; + const root = j( file.source ); + + // Modify file's AST (Abstract Syntax Tree) structure here + + return root.toSource( config.recastOptions ); +} +``` + +A nifty tool to explore AST structures is [AST explorer](https://astexplorer.net/). +You can choose "recast" as a parser and "jscodeshift" from "Transform" menu. + ## How to run our codemods It's easy! Our codemod script uses the following CLI: diff --git a/bin/codemods/src/config.js b/bin/codemods/src/config.js index 0f16ec4006b53..875544f4991b3 100644 --- a/bin/codemods/src/config.js +++ b/bin/codemods/src/config.js @@ -62,4 +62,5 @@ const codemodArgs = { module.exports = { codemodArgs, jscodeshiftArgs, + recastOptions, }; diff --git a/circle.yml b/circle.yml index 17b5b632334ff..6c649281b6a5d 100644 --- a/circle.yml +++ b/circle.yml @@ -1,6 +1,6 @@ machine: node: - version: 6.11.2 + version: 6.11.5 test: pre: - ? | diff --git a/client/blocks/author-compact-profile/style.scss b/client/blocks/author-compact-profile/style.scss index 87736dd112dd2..370428148e556 100644 --- a/client/blocks/author-compact-profile/style.scss +++ b/client/blocks/author-compact-profile/style.scss @@ -18,7 +18,7 @@ border-radius: 0; padding: 0; - .gridicon__follow { + .gridicons-reader-follow { fill: $blue-medium; } @@ -38,7 +38,7 @@ // No hover if already following &.is-following { &:hover { - .gridicon__follow { + .gridicons-reader-follow { fill: $alert-green; } diff --git a/client/blocks/comment-button/README.md b/client/blocks/comment-button/README.md index 41a3acfd9047c..67895abe23cc7 100644 --- a/client/blocks/comment-button/README.md +++ b/client/blocks/comment-button/README.md @@ -18,7 +18,9 @@ render() { #### Props * `commentCount`: Number indicating the number of comments to be displayed next to the button. +* `link`: String URL destination to be used with a `tagName` of `a`. Defaults to `null`. * `onClick`: Function to be executed when the user clicks the button. -* `tagName`: String with the HTML tag we are going to use to render the component. Defaults to 'li'. * `showLabel`: Boolean indicating whether or not the label with the comments count is visible. Defaults to `true`. * `size`: Number with the size of the comments icon to be displayed. Defaults to 24. +* `tagName`: String with the HTML tag we are going to use to render the component. Defaults to 'li'. +* `target`: String `target` attribute to be used with a `tagName` of `a`. Defaults to `null`. \ No newline at end of file diff --git a/client/blocks/comment-button/index.jsx b/client/blocks/comment-button/index.jsx index 37bcacc0bea77..a95b2ea204320 100644 --- a/client/blocks/comment-button/index.jsx +++ b/client/blocks/comment-button/index.jsx @@ -8,7 +8,7 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { connect } from 'react-redux'; import { localize } from 'i18n-calypso'; -import { noop } from 'lodash'; +import { isNull, noop, omitBy } from 'lodash'; /** * Internal dependencies @@ -18,29 +18,38 @@ import { getPostTotalCommentsCount } from 'state/comments/selectors'; class CommentButton extends Component { static propTypes = { - onClick: PropTypes.func, - tagName: PropTypes.string, commentCount: PropTypes.number, + href: PropTypes.string, + onClick: PropTypes.func, showLabel: PropTypes.bool, + tagName: PropTypes.string, + target: PropTypes.string, }; static defaultProps = { - onClick: noop, - tagName: 'li', - size: 24, commentCount: 0, + href: null, + onClick: noop, showLabel: true, + size: 24, + tagName: 'li', + target: null, }; render() { - const { translate, commentCount, onClick, showLabel, tagName: containerTag } = this.props; + const { commentCount, href, onClick, showLabel, tagName, target, translate } = this.props; return React.createElement( - containerTag, - { - className: 'comment-button', - onClick, - }, + tagName, + omitBy( + { + className: 'comment-button', + href: 'a' === tagName ? href : null, + onClick, + target: 'a' === tagName ? target : null, + }, + isNull + ), , { commentCount > 0 && ( diff --git a/client/blocks/comment-detail/comment-detail-header.jsx b/client/blocks/comment-detail/comment-detail-header.jsx index 7e532a1016283..8d00a14601274 100644 --- a/client/blocks/comment-detail/comment-detail-header.jsx +++ b/client/blocks/comment-detail/comment-detail-header.jsx @@ -22,25 +22,17 @@ import FormCheckbox from 'components/forms/form-checkbox'; import { stripHTML, decodeEntities } from 'lib/formatting'; import { urlToDomainAndPath } from 'lib/url'; import viewport from 'lib/viewport'; -import { convertDateToUserLocation } from 'components/post-schedule/utils'; -import { gmtOffset, timezone } from 'lib/site/utils'; - -const getRelativeTimePeriod = ( commentDate, site, moment ) => { - const localizedDate = convertDateToUserLocation( - commentDate || moment(), - timezone( site ), - gmtOffset( site ) - ); +const getRelativeTimePeriod = ( commentDate, moment ) => { if ( moment() .subtract( 1, 'month' ) - .isBefore( localizedDate ) + .isBefore( commentDate ) ) { - return localizedDate.fromNow(); + return moment( commentDate ).fromNow(); } - return localizedDate.format( 'll' ); + return moment( commentDate ).format( 'll' ); }; export class CommentDetailHeader extends Component { @@ -69,7 +61,6 @@ export class CommentDetailHeader extends Component { isExpanded, moment, postTitle, - site, toggleReply, toggleApprove, toggleEditMode, @@ -152,7 +143,7 @@ export class CommentDetailHeader extends Component {
- { getRelativeTimePeriod( commentDate, site, moment ) } + { getRelativeTimePeriod( commentDate, moment ) }
diff --git a/client/blocks/comment-detail/index.jsx b/client/blocks/comment-detail/index.jsx index 89154c289d21f..eaf022b227b27 100644 --- a/client/blocks/comment-detail/index.jsx +++ b/client/blocks/comment-detail/index.jsx @@ -27,8 +27,10 @@ import { decodeEntities, stripHTML } from 'lib/formatting'; import { getPostCommentsTree } from 'state/comments/selectors'; import { getSitePost } from 'state/posts/selectors'; import getSiteComment from 'state/selectors/get-site-comment'; -import { getSite, isJetpackMinimumVersion, isJetpackSite } from 'state/sites/selectors'; +import { isJetpackMinimumVersion, isJetpackSite } from 'state/sites/selectors'; import { bumpStat, composeAnalytics, recordTracksEvent } from 'state/analytics/actions'; +import { getSelectedSiteSlug } from 'state/ui/selectors'; +import config from 'config'; /** * Creates a stripped down comment object containing only the information needed by @@ -129,6 +131,18 @@ export class CommentDetail extends Component { exitReplyState = () => this.setState( { isReplyMode: false } ); + getPostUrl = () => { + const { commentStatus, postId, postUrl, siteSlug } = this.props; + + if ( ! config.isEnabled( 'comments/management/post-view' ) ) { + return postUrl; + } + + const status = 'unapproved' === commentStatus ? 'pending' : commentStatus; + + return `/comments/${ status }/${ siteSlug }/${ postId }`; + }; + toggleApprove = e => { e.stopPropagation(); @@ -224,7 +238,7 @@ export class CommentDetail extends Component { trackDeepReaderLinkClick = () => { const { isJetpack, parentCommentContent } = this.props; - if ( isJetpack ) { + if ( isJetpack || config.isEnabled( 'comments/management/post-view' ) ) { return; } if ( parentCommentContent ) { @@ -262,21 +276,19 @@ export class CommentDetail extends Component { postAuthorDisplayName, postId, postTitle, - postUrl, refreshCommentData, repliedToComment, replyComment, - site, siteBlacklist, siteId, translate, } = this.props; + const { isEditMode, isExpanded } = this.state; + const authorDisplayName = authorName || translate( 'Anonymous' ); const authorIsBlocked = this.isAuthorBlacklisted(); - const { isEditMode, isExpanded } = this.state; - const classes = classNames( 'comment-detail', { 'author-is-blocked': authorIsBlocked, 'comment-detail__placeholder': isLoading, @@ -298,7 +310,9 @@ export class CommentDetail extends Component { className={ classes } tabIndex="0" > - { refreshCommentData && } + { refreshCommentData && ( + + ) } { ! isPostTitleLoaded && } @@ -318,7 +332,6 @@ export class CommentDetail extends Component { isExpanded={ isExpanded } postId={ postId } postTitle={ postTitle } - site={ site } toggleApprove={ this.toggleApprove } toggleEditMode={ this.toggleEditMode } toggleExpanded={ this.toggleExpanded } @@ -337,7 +350,7 @@ export class CommentDetail extends Component { parentCommentContent={ parentCommentContent } postAuthorDisplayName={ postAuthorDisplayName } postTitle={ postTitle } - postUrl={ postUrl } + postUrl={ this.getPostUrl() } siteId={ siteId } onClick={ this.trackDeepReaderLinkClick } /> @@ -449,8 +462,8 @@ const mapStateToProps = ( state, ownProps ) => { postUrl: isJetpack ? get( comment, 'URL' ) : `/read/blogs/${ siteId }/posts/${ postId }`, postTitle, repliedToComment: get( comment, 'replied' ), // TODO: not available in the current data structure + siteSlug: getSelectedSiteSlug( state ), siteId: get( comment, 'siteId', siteId ), - site: getSite( state, siteId ), }; }; diff --git a/client/blocks/comments/comments-filters.js b/client/blocks/comments/comments-filters.js new file mode 100644 index 0000000000000..ffa072203aa70 --- /dev/null +++ b/client/blocks/comments/comments-filters.js @@ -0,0 +1,2 @@ +/** @format */ +export const COMMENTS_FILTER_ALL = 'all'; diff --git a/client/blocks/comments/post-comment-list.jsx b/client/blocks/comments/post-comment-list.jsx index da52142b02167..f29fb6e14b36e 100644 --- a/client/blocks/comments/post-comment-list.jsx +++ b/client/blocks/comments/post-comment-list.jsx @@ -55,6 +55,11 @@ class PostCommentList extends React.Component { commentCount: PropTypes.number, maxDepth: PropTypes.number, showNestingReplyArrow: PropTypes.bool, + commentsFilter: PropTypes.string, + + // To display comments with a different status but not fetch them + // e.g. Reader full post view showing unapproved comments made to a moderated site + commentsFilterDisplay: PropTypes.string, // connect()ed props: commentsTree: PropTypes.object, @@ -453,7 +458,7 @@ export default connect( state, ownProps.post.site_ID, ownProps.post.ID, - ownProps.commentsFilter + ownProps.commentsFilterDisplay ? ownProps.commentsFilterDisplay : ownProps.commentsFilter ), commentsFetchingStatus: commentsFetchingStatus( state, diff --git a/client/blocks/comments/style.scss b/client/blocks/comments/style.scss index 70ad2d4f75100..21a4f3a0c4d17 100644 --- a/client/blocks/comments/style.scss +++ b/client/blocks/comments/style.scss @@ -52,6 +52,7 @@ white-space: pre-wrap; word-wrap: break-word; + word-break: break-word; } textarea { diff --git a/client/blocks/conversation-follow-button/button.jsx b/client/blocks/conversation-follow-button/button.jsx new file mode 100644 index 0000000000000..cbc13d53720db --- /dev/null +++ b/client/blocks/conversation-follow-button/button.jsx @@ -0,0 +1,76 @@ +/** + * @format + */ + +/** + * External dependencies + */ +import PropTypes from 'prop-types'; +import React from 'react'; +import { noop } from 'lodash'; +import { localize } from 'i18n-calypso'; +import Gridicon from 'gridicons'; + +class ConversationFollowButton extends React.Component { + static propTypes = { + isFollowing: PropTypes.bool.isRequired, + onFollowToggle: PropTypes.func, + tagName: PropTypes.oneOfType( [ PropTypes.string, PropTypes.func ] ), + }; + + static defaultProps = { + isFollowing: false, + onFollowToggle: noop, + tagName: 'button', + }; + + toggleFollow = event => { + if ( event ) { + event.preventDefault(); + } + + this.props.onFollowToggle( ! this.props.isFollowing ); + }; + + render() { + const { isFollowing, translate } = this.props; + const buttonClasses = [ + 'button', + 'has-icon', + 'conversation-follow-button', + this.props.className, + ]; + const iconSize = 20; + const label = isFollowing + ? translate( 'Following Conversation' ) + : translate( 'Follow Conversation' ); + + if ( this.props.isFollowing ) { + buttonClasses.push( 'is-following' ); + } + + const followingIcon = ( + + ); + const followIcon = ( + + ); + const followLabelElement = ( + + { label } + + ); + + return React.createElement( + this.props.tagName, + { + onClick: this.toggleFollow, + className: buttonClasses.join( ' ' ), + title: label, + }, + [ followingIcon, followIcon, followLabelElement ] + ); + } +} + +export default localize( ConversationFollowButton ); diff --git a/client/blocks/conversation-follow-button/docs/example.jsx b/client/blocks/conversation-follow-button/docs/example.jsx new file mode 100644 index 0000000000000..cc38cc1c5efe8 --- /dev/null +++ b/client/blocks/conversation-follow-button/docs/example.jsx @@ -0,0 +1,31 @@ +/* + * @format + */ + +/** + * External dependencies + */ +import React from 'react'; + +/** + * Internal dependencies + */ +import ConversationFollowButton from 'blocks/conversation-follow-button/button'; +import Card from 'components/card/compact'; + +export default class ConversationFollowButtonExample extends React.PureComponent { + static displayName = 'ConversationFollowButton'; + + render() { + return ( +
+ + + + + + +
+ ); + } +} diff --git a/client/blocks/conversation-follow-button/index.jsx b/client/blocks/conversation-follow-button/index.jsx new file mode 100644 index 0000000000000..7233bfcdef492 --- /dev/null +++ b/client/blocks/conversation-follow-button/index.jsx @@ -0,0 +1,67 @@ +/** + * @format + */ + +/* + * External dependencies + */ +import PropTypes from 'prop-types'; +import React, { Component } from 'react'; +import { noop } from 'lodash'; +import { connect } from 'react-redux'; + +/** + * Internal dependencies + */ +import ConversationFollowButton from './button'; +import { isFollowingReaderConversation } from 'state/selectors'; +import { followConversation, muteConversation } from 'state/reader/conversations/actions'; + +class ConversationFollowButtonContainer extends Component { + static propTypes = { + siteId: PropTypes.number.isRequired, + postId: PropTypes.number.isRequired, + onFollowToggle: PropTypes.func, + tagName: PropTypes.oneOfType( [ PropTypes.string, PropTypes.func ] ), + }; + + static defaultProps = { + onFollowToggle: noop, + }; + + handleFollowToggle = isRequestingFollow => { + const { siteId, postId } = this.props; + + if ( isRequestingFollow ) { + this.props.followConversation( { siteId, postId } ); + } else { + this.props.muteConversation( { siteId, postId } ); + } + + this.props.onFollowToggle( isRequestingFollow ); + }; + + render() { + return ( + + ); + } +} + +export default connect( + ( state, ownProps ) => ( { + isFollowing: isFollowingReaderConversation( state, { + siteId: ownProps.siteId, + postId: ownProps.postId, + } ), + } ), + { + followConversation, + muteConversation, + } +)( ConversationFollowButtonContainer ); diff --git a/client/blocks/conversation-follow-button/style.scss b/client/blocks/conversation-follow-button/style.scss new file mode 100644 index 0000000000000..2009354b9ac01 --- /dev/null +++ b/client/blocks/conversation-follow-button/style.scss @@ -0,0 +1,76 @@ +.conversation-follow-button, +button.conversation-follow-button { + border: 0; + padding: 0; + + .gridicons-reader-follow-conversation { + fill: $blue-medium; + pointer-events: auto; + } + + .conversation-follow-button__label { + color: $blue-medium; + } + + &:hover { + color: $blue-medium; + + .gridicons-reader-follow-conversation { + fill: $blue-medium; + } + } + + &:focus { + box-shadow: none; + } + + // Hides Following icon by default + .gridicons-reader-following-conversation { + display: none; + pointer-events: none; + } + + &.is-following { + + .gridicons-reader-following-conversation { + display: inline-block; + fill: $alert-green; + pointer-events: auto; + } + + .conversation-follow-button__label { + color: $alert-green; + } + + // Hides Follow icon if already following + .gridicons-reader-follow-conversation { + display: none; + pointer-events: none; + } + + &:hover { + color: $alert-green; + + .gridicons-reader-following-conversation { + fill: $alert-green; + } + } + } + + .gridicons-reader-following-conversation { + pointer-events: none; + } + + .gridicon { + height: 18px; + padding-right: 4px; + top: 5px; + width: 18px; + } +} + +.conversation-follow-button__label { + @include breakpoint( "<660px" ) { + display: none; + } +} diff --git a/client/blocks/follow-button/button.jsx b/client/blocks/follow-button/button.jsx index c94ebfc10a9d6..db68eccd8d290 100644 --- a/client/blocks/follow-button/button.jsx +++ b/client/blocks/follow-button/button.jsx @@ -8,6 +8,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import { noop } from 'lodash'; import { localize } from 'i18n-calypso'; +import Gridicon from 'gridicons'; class FollowButton extends React.Component { static propTypes = { @@ -63,39 +64,13 @@ class FollowButton extends React.Component { menuClasses.push( 'is-disabled' ); } - const followingIcon = ( - - - - - - ), - followIcon = ( - - - - - - ), - followLabelElement = ( - - { label } - - ); + const followingIcon = ; + const followIcon = ; + const followLabelElement = ( + + { label } + + ); return React.createElement( this.props.tagName, diff --git a/client/blocks/follow-button/index.jsx b/client/blocks/follow-button/index.jsx index a5eeb83c42917..3b130c62a558f 100644 --- a/client/blocks/follow-button/index.jsx +++ b/client/blocks/follow-button/index.jsx @@ -30,6 +30,7 @@ class FollowButtonContainer extends Component { static defaultProps = { onFollowToggle: noop, }; + handleFollowToggle = following => { if ( following ) { const followData = omitBy( diff --git a/client/blocks/follow-button/style.scss b/client/blocks/follow-button/style.scss index c9eb5920f87ff..da9f545e32a62 100644 --- a/client/blocks/follow-button/style.scss +++ b/client/blocks/follow-button/style.scss @@ -5,7 +5,7 @@ button.follow-button { border: 0; padding: 0; - .gridicon__follow { + .gridicons-reader-follow { fill: $blue-medium; pointer-events: auto; } @@ -17,7 +17,7 @@ button.follow-button { &:hover { color: $blue-medium; - .gridicon__follow { + .gridicons-reader-follow { fill: $blue-medium; } } @@ -27,14 +27,14 @@ button.follow-button { } // Hides Following icon by default - .gridicon__following { + .gridicons-reader-following { display: none; pointer-events: none; } &.is-following { - .gridicon__following { + .gridicons-reader-following { display: inline-block; fill: $alert-green; pointer-events: auto; @@ -45,7 +45,7 @@ button.follow-button { } // Hides Follow icon if already following - .gridicon__follow { + .gridicons-reader-follow { display: none; pointer-events: none; } @@ -53,13 +53,13 @@ button.follow-button { &:hover { color: $alert-green; - .gridicon__following { + .gridicons-reader-following { fill: $alert-green; } } } - .gridicon__following { + .gridicons-reader-following { pointer-events: none; } diff --git a/client/blocks/jitm/index.jsx b/client/blocks/jitm/index.jsx index a7a025805df1b..4225daddb1373 100644 --- a/client/blocks/jitm/index.jsx +++ b/client/blocks/jitm/index.jsx @@ -1,3 +1,5 @@ +/** @format */ + /** * External Dependencies */ @@ -9,6 +11,7 @@ import { connect } from 'react-redux'; */ import { getSelectedSite } from 'state/ui/selectors'; import { getTopJITM } from 'state/jitm/selectors'; +import { dismissJetpackJITM } from 'state/jitm/actions'; import Banner from 'components/banner'; export const JITM = ( { @@ -19,25 +22,32 @@ export const JITM = ( { featureClass, id, message, -} ) => ( hasJitm && currentSite ) && ( - -); + onDismiss, +} ) => + hasJitm && + currentSite && ( + + ); + +const mapStateToProps = state => ( { + currentSite: getSelectedSite( state ), + hasJitm: !! getTopJITM( state ), + ...getTopJITM( state ), +} ); -const mapStateToProps = ( state ) => ( - { - currentSite: getSelectedSite( state ), - hasJitm: !! getTopJITM( state ), - ...getTopJITM( state ), - } -); +const mapDispatchToProps = dispatch => ( { + onDismiss: ( siteId, id, featureClass ) => () => + dispatch( dismissJetpackJITM( siteId, id, featureClass ) ), +} ); -export default connect( mapStateToProps )( JITM ); +export default connect( mapStateToProps, mapDispatchToProps )( JITM ); diff --git a/client/blocks/post-actions/index.jsx b/client/blocks/post-actions/index.jsx index b1f96a1793502..d65f30a0b0bc9 100644 --- a/client/blocks/post-actions/index.jsx +++ b/client/blocks/post-actions/index.jsx @@ -15,13 +15,14 @@ import { localize } from 'i18n-calypso'; /** * Internal dependencies */ +import config from 'config'; import { recordGoogleEvent } from 'state/analytics/actions'; import PostRelativeTimeStatus from 'my-sites/post-relative-time-status'; import CommentButton from 'blocks/comment-button'; import LikeButton from 'my-sites/post-like-button'; import PostTotalViews from 'my-sites/posts/post-total-views'; import { canCurrentUser } from 'state/selectors'; -import { isJetpackModuleActive, isJetpackSite } from 'state/sites/selectors'; +import { isJetpackModuleActive, isJetpackSite, getSiteSlug } from 'state/sites/selectors'; import { getEditorPath } from 'state/ui/editor/selectors'; const getContentLink = ( state, siteId, post ) => { @@ -47,6 +48,7 @@ const PostActions = ( { showComments, showLikes, showStats, + siteSlug, toggleComments, trackRelativeTimeStatusOnClick, trackTotalViewsOnClick, @@ -67,14 +69,25 @@ const PostActions = ( { { ! isDraft && showComments && (
  • - + { config.isEnabled( 'comments/management/post-view' ) ? ( + + ) : ( + + ) }
  • ) } { ! isDraft && @@ -109,6 +122,7 @@ PostActions.propTypes = { const mapStateToProps = ( state, { siteId, post } ) => { const isJetpack = isJetpackSite( state, siteId ); + const siteSlug = getSiteSlug( state, siteId ); // TODO: Maybe add dedicated selectors for the following. const showComments = @@ -125,6 +139,7 @@ const mapStateToProps = ( state, { siteId, post } ) => { showComments, showLikes, showStats, + siteSlug, }; }; diff --git a/client/blocks/reader-full-post/index.jsx b/client/blocks/reader-full-post/index.jsx index 6b96a9e977bf2..36ec92ad73a16 100644 --- a/client/blocks/reader-full-post/index.jsx +++ b/client/blocks/reader-full-post/index.jsx @@ -70,6 +70,7 @@ import { getLastStore } from 'reader/controller-helper'; import { showSelectedPost } from 'reader/utils'; import Emojify from 'components/emojify'; import config from 'config'; +import { COMMENTS_FILTER_ALL } from 'blocks/comments/comments-filters'; export class FullPostView extends React.Component { static propTypes = { @@ -439,7 +440,7 @@ export class FullPostView extends React.Component { ) }
    - { shouldShowComments( post ) ? ( + { shouldShowComments( post ) && ( - ) : null } + ) }
    { showRelatedPosts && ( diff --git a/client/blocks/reader-post-options-menu/index.jsx b/client/blocks/reader-post-options-menu/index.jsx index 974a7523f5bc4..bd6fceb959528 100644 --- a/client/blocks/reader-post-options-menu/index.jsx +++ b/client/blocks/reader-post-options-menu/index.jsx @@ -9,6 +9,7 @@ import page from 'page'; import classnames from 'classnames'; import { connect } from 'react-redux'; import { localize } from 'i18n-calypso'; +import config from 'config'; /** * Internal dependencies @@ -28,6 +29,8 @@ import QueryReaderTeams from 'components/data/query-reader-teams'; import { isAutomatticTeamMember } from 'reader/lib/teams'; import { getReaderTeams } from 'state/selectors'; import ReaderPostOptionsMenuBlogStickers from './blog-stickers'; +import ConversationFollowButton from 'blocks/conversation-follow-button'; +import { shouldShowComments } from 'blocks/comments/helper'; class ReaderPostOptionsMenu extends React.Component { static propTypes = { @@ -120,10 +123,17 @@ class ReaderPostOptionsMenu extends React.Component { render() { const { post, site, feed, teams, translate, position } = this.props; + const { ID: postId, site_ID: siteId } = post; const isEditPossible = PostUtils.userCan( 'edit_post', post ); const isDiscoverPost = DiscoverHelper.isDiscoverPost( post ); const followUrl = this.getFollowUrl(); const isTeamMember = isAutomatticTeamMember( teams ); + const showConversationFollow = + config.isEnabled( 'reader/conversations' ) && + siteId && + ! post.is_external && + shouldShowComments( post ) && + ! isDiscoverPost; let isBlockPossible = false; @@ -157,7 +167,20 @@ class ReaderPostOptionsMenu extends React.Component { { isTeamMember && site && } { this.props.showFollow && ( - + + ) } + + { showConversationFollow && ( + ) } { post.URL && ( diff --git a/client/blocks/reader-post-options-menu/style.scss b/client/blocks/reader-post-options-menu/style.scss index 783b00c790de7..d0d9b713d2696 100644 --- a/client/blocks/reader-post-options-menu/style.scss +++ b/client/blocks/reader-post-options-menu/style.scss @@ -22,8 +22,12 @@ } .reader-post-options-menu__popover { + .popover__menu { + min-width: 212px; + } - .popover__menu .follow-button { + .popover__menu .follow-button, + .popover__menu .conversation-follow-button { color: $blue-medium; padding: 9px 16px; @@ -46,13 +50,15 @@ fill: $white; } - .follow-button__label { + .follow-button__label, + .conversation-follow-button__label { color: $white; } } } - .follow-button__label { + .follow-button__label, + .conversation-follow-button__label { display: inline-block; margin-left: 26px; } diff --git a/client/blocks/reader-recommended-sites/style.scss b/client/blocks/reader-recommended-sites/style.scss index 4fd181774f837..304a45bc11548 100644 --- a/client/blocks/reader-recommended-sites/style.scss +++ b/client/blocks/reader-recommended-sites/style.scss @@ -137,7 +137,7 @@ $reader-related-card-v2-breakpoint-small: "( max-width: 535px )"; } } - .gridicon.gridicon__follow { + .gridicon.gridicons-reader-follow { @include breakpoint( "<960px" ) { left: 4px; diff --git a/client/blocks/reader-related-card-v2/style.scss b/client/blocks/reader-related-card-v2/style.scss index 0014a4be3292d..8ffd76d6dc5a3 100644 --- a/client/blocks/reader-related-card-v2/style.scss +++ b/client/blocks/reader-related-card-v2/style.scss @@ -569,7 +569,7 @@ $reader-related-card-v2-breakpoint-small: "( max-width: 535px )"; padding: 0; z-index: z-index( '.reader-related-card-v2__meta', '.follow-button' ); - .gridicon__follow { + .gridicons-reader-follow { fill: $blue-medium; } diff --git a/client/boot/common.js b/client/boot/common.js index 7aaf7bd236804..ce4de923195c5 100644 --- a/client/boot/common.js +++ b/client/boot/common.js @@ -38,9 +38,7 @@ const setupContextMiddleware = reduxStore => { page( '*', ( context, next ) => { // page.js url parsing is broken so we had to disable it with `decodeURLComponents: false` const parsed = url.parse( context.canonicalPath, true ); - context.pathname = parsed.pathname; context.prevPath = parsed.path === context.path ? false : parsed.path; - context.path = parsed.path; context.query = parsed.query; context.hashstring = ( parsed.hash && parsed.hash.substring( 1 ) ) || ''; diff --git a/client/boot/project/wordpress-com.js b/client/boot/project/wordpress-com.js index 9343bc6778174..ba88a3eb332c8 100644 --- a/client/boot/project/wordpress-com.js +++ b/client/boot/project/wordpress-com.js @@ -16,7 +16,9 @@ import debugFactory from 'debug'; */ import config from 'config'; import { getSavedVariations } from 'lib/abtest'; // used by error logger -import { initialize as initializeHappychat } from 'state/happychat/connection/actions'; +import { initConnection as initHappychatConnection } from 'state/happychat/connection/actions'; +import { getHappychatAuth } from 'state/happychat/utils'; +import wasHappychatRecentlyActive from 'state/happychat/selectors/was-happychat-recently-active'; import analytics from 'lib/analytics'; import { setReduxStore as setReduxBridgeReduxStore } from 'lib/redux-bridge'; import route from 'lib/route'; @@ -213,7 +215,10 @@ export function setupMiddlewares( currentUser, reduxStore ) { asyncRequire( 'lib/olark', olark => olark.initialize( reduxStore.dispatch ) ); } - reduxStore.dispatch( initializeHappychat() ); + const state = reduxStore.getState(); + if ( wasHappychatRecentlyActive( state ) ) { + reduxStore.dispatch( initHappychatConnection( getHappychatAuth( state )() ) ); + } if ( config.isEnabled( 'keyboard-shortcuts' ) ) { require( 'lib/keyboard-shortcuts/global' )(); diff --git a/client/components/card/compact.jsx b/client/components/card/compact.jsx index 755e0103dd42f..03d733e29314c 100644 --- a/client/components/card/compact.jsx +++ b/client/components/card/compact.jsx @@ -1,27 +1,19 @@ +/** @format */ /** * External dependencies - * - * @format */ - import React from 'react'; -import { assign } from 'lodash'; import classnames from 'classnames'; -import createClass from 'create-react-class'; /** * Internal dependencies */ import Card from 'components/card'; -export default createClass( { - displayName: 'CompactCard', - - render: function() { - const props = assign( {}, this.props, { - className: classnames( this.props.className, 'is-compact' ), - } ); - - return { this.props.children }; - }, -} ); +export default function CompactCard( props ) { + return ( + + { props.children } + + ); +} diff --git a/client/components/card/index.jsx b/client/components/card/index.jsx index 7555754af79f8..1495a8160d2e0 100644 --- a/client/components/card/index.jsx +++ b/client/components/card/index.jsx @@ -26,7 +26,7 @@ class Card extends Component { }; render() { - const { href, tagName, target, compact, children, highlight } = this.props; + const { children, compact, highlight, href, onClick, tagName, target } = this.props; const highlightClass = highlight ? 'is-' + highlight : false; @@ -35,6 +35,7 @@ class Card extends Component { this.props.className, { 'is-card-link': !! href, + 'is-clickable': !! onClick, 'is-compact': compact, }, highlightClass diff --git a/client/components/card/style.scss b/client/components/card/style.scss index 1b759144938ea..a78d1a0008b25 100644 --- a/client/components/card/style.scss +++ b/client/components/card/style.scss @@ -29,6 +29,10 @@ padding-right: 48px; } + &.is-clickable { + cursor: pointer; + } + &.is-error { box-shadow: inset 3px 0 0 $alert-red; } @@ -69,4 +73,3 @@ a.card:focus { color: $link-highlight; } } - diff --git a/client/components/card/test/__snapshots__/index.js.snap b/client/components/card/test/__snapshots__/index.js.snap new file mode 100644 index 0000000000000..4434e45ade7a1 --- /dev/null +++ b/client/components/card/test/__snapshots__/index.js.snap @@ -0,0 +1,721 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Card should be linkable 1`] = ` +ShallowWrapper { + "complexSelector": ComplexSelector { + "buildPredicate": [Function], + "childrenOfNode": [Function], + "findWhereUnwrapped": [Function], + }, + "length": 1, + "node": + + This is a linked card + , + "nodes": Array [ + + + This is a linked card + , + ], + "options": Object {}, + "renderer": ReactShallowRenderer { + "_instance": ShallowComponentWrapper { + "_calledComponentWillUnmount": false, + "_compositeType": 0, + "_context": Object {}, + "_currentElement": + This is a linked card + , + "_debugID": 7, + "_hostContainerInfo": null, + "_hostParent": null, + "_instance": Card { + "_reactInternalInstance": [Circular], + "context": Object {}, + "props": Object { + "children": "This is a linked card", + "highlight": false, + "href": "/test", + "tagName": "div", + }, + "refs": Object {}, + "state": null, + "updater": Object { + "enqueueCallback": [Function], + "enqueueCallbackInternal": [Function], + "enqueueElementInternal": [Function], + "enqueueForceUpdate": [Function], + "enqueueReplaceState": [Function], + "enqueueSetState": [Function], + "isMounted": [Function], + "validateCallback": [Function], + }, + }, + "_mountOrder": 4, + "_pendingCallbacks": null, + "_pendingElement": null, + "_pendingForceUpdate": false, + "_pendingReplaceState": false, + "_pendingStateQueue": null, + "_renderedComponent": NoopInternalComponent { + "_currentElement": + + This is a linked card + , + "_debugID": 8, + "_renderedOutput": + + This is a linked card + , + }, + "_renderedNodeType": 0, + "_rootNodeID": 0, + "_topLevelWrapper": null, + "_updateBatchNumber": null, + "_warnedAboutRefsInRender": false, + }, + "getRenderOutput": [Function], + "render": [Function], + }, + "root": [Circular], + "unrendered": + This is a linked card + , +} +`; + +exports[`Card should have \`card\` class 1`] = ` +ShallowWrapper { + "complexSelector": ComplexSelector { + "buildPredicate": [Function], + "childrenOfNode": [Function], + "findWhereUnwrapped": [Function], + }, + "length": 1, + "node":
    , + "nodes": Array [ +
    , + ], + "options": Object {}, + "renderer": ReactShallowRenderer { + "_instance": ShallowComponentWrapper { + "_calledComponentWillUnmount": false, + "_compositeType": 0, + "_context": Object {}, + "_currentElement": , + "_debugID": 1, + "_hostContainerInfo": null, + "_hostParent": null, + "_instance": Card { + "_reactInternalInstance": [Circular], + "context": Object {}, + "props": Object { + "highlight": false, + "tagName": "div", + }, + "refs": Object {}, + "state": null, + "updater": Object { + "enqueueCallback": [Function], + "enqueueCallbackInternal": [Function], + "enqueueElementInternal": [Function], + "enqueueForceUpdate": [Function], + "enqueueReplaceState": [Function], + "enqueueSetState": [Function], + "isMounted": [Function], + "validateCallback": [Function], + }, + }, + "_mountOrder": 1, + "_pendingCallbacks": null, + "_pendingElement": null, + "_pendingForceUpdate": false, + "_pendingReplaceState": false, + "_pendingStateQueue": null, + "_renderedComponent": NoopInternalComponent { + "_currentElement":
    , + "_debugID": 2, + "_renderedOutput":
    , + }, + "_renderedNodeType": 0, + "_rootNodeID": 0, + "_topLevelWrapper": null, + "_updateBatchNumber": null, + "_warnedAboutRefsInRender": false, + }, + "getRenderOutput": [Function], + "render": [Function], + }, + "root": [Circular], + "unrendered": , +} +`; + +exports[`Card should have custom class of \`test__ace\` 1`] = ` +ShallowWrapper { + "complexSelector": ComplexSelector { + "buildPredicate": [Function], + "childrenOfNode": [Function], + "findWhereUnwrapped": [Function], + }, + "length": 1, + "node":
    , + "nodes": Array [ +
    , + ], + "options": Object {}, + "renderer": ReactShallowRenderer { + "_instance": ShallowComponentWrapper { + "_calledComponentWillUnmount": false, + "_compositeType": 0, + "_context": Object {}, + "_currentElement": , + "_debugID": 3, + "_hostContainerInfo": null, + "_hostParent": null, + "_instance": Card { + "_reactInternalInstance": [Circular], + "context": Object {}, + "props": Object { + "className": "test__ace", + "highlight": false, + "tagName": "div", + }, + "refs": Object {}, + "state": null, + "updater": Object { + "enqueueCallback": [Function], + "enqueueCallbackInternal": [Function], + "enqueueElementInternal": [Function], + "enqueueForceUpdate": [Function], + "enqueueReplaceState": [Function], + "enqueueSetState": [Function], + "isMounted": [Function], + "validateCallback": [Function], + }, + }, + "_mountOrder": 2, + "_pendingCallbacks": null, + "_pendingElement": null, + "_pendingForceUpdate": false, + "_pendingReplaceState": false, + "_pendingStateQueue": null, + "_renderedComponent": NoopInternalComponent { + "_currentElement":
    , + "_debugID": 4, + "_renderedOutput":
    , + }, + "_renderedNodeType": 0, + "_rootNodeID": 0, + "_topLevelWrapper": null, + "_updateBatchNumber": null, + "_warnedAboutRefsInRender": false, + }, + "getRenderOutput": [Function], + "render": [Function], + }, + "root": [Circular], + "unrendered": , +} +`; + +exports[`Card should render children 1`] = ` +ShallowWrapper { + "complexSelector": ComplexSelector { + "buildPredicate": [Function], + "childrenOfNode": [Function], + "findWhereUnwrapped": [Function], + }, + "length": 1, + "node":
    + This is a card +
    , + "nodes": Array [ +
    + This is a card +
    , + ], + "options": Object {}, + "renderer": ReactShallowRenderer { + "_instance": ShallowComponentWrapper { + "_calledComponentWillUnmount": false, + "_compositeType": 0, + "_context": Object {}, + "_currentElement": + This is a card + , + "_debugID": 5, + "_hostContainerInfo": null, + "_hostParent": null, + "_instance": Card { + "_reactInternalInstance": [Circular], + "context": Object {}, + "props": Object { + "children": "This is a card", + "highlight": false, + "tagName": "div", + }, + "refs": Object {}, + "state": null, + "updater": Object { + "enqueueCallback": [Function], + "enqueueCallbackInternal": [Function], + "enqueueElementInternal": [Function], + "enqueueForceUpdate": [Function], + "enqueueReplaceState": [Function], + "enqueueSetState": [Function], + "isMounted": [Function], + "validateCallback": [Function], + }, + }, + "_mountOrder": 3, + "_pendingCallbacks": null, + "_pendingElement": null, + "_pendingForceUpdate": false, + "_pendingReplaceState": false, + "_pendingStateQueue": null, + "_renderedComponent": NoopInternalComponent { + "_currentElement":
    + This is a card +
    , + "_debugID": 6, + "_renderedOutput":
    + This is a card +
    , + }, + "_renderedNodeType": 0, + "_rootNodeID": 0, + "_topLevelWrapper": null, + "_updateBatchNumber": null, + "_warnedAboutRefsInRender": false, + }, + "getRenderOutput": [Function], + "render": [Function], + }, + "root": [Circular], + "unrendered": + This is a card + , +} +`; + +exports[`CompactCard should have \`is-compact\` class 1`] = ` +ShallowWrapper { + "complexSelector": ComplexSelector { + "buildPredicate": [Function], + "childrenOfNode": [Function], + "findWhereUnwrapped": [Function], + }, + "length": 1, + "node": , + "nodes": Array [ + , + ], + "options": Object {}, + "renderer": ReactShallowRenderer { + "_instance": ShallowComponentWrapper { + "_calledComponentWillUnmount": false, + "_compositeType": 2, + "_context": Object {}, + "_currentElement": , + "_debugID": 9, + "_hostContainerInfo": null, + "_hostParent": null, + "_instance": StatelessComponent { + "_reactInternalInstance": [Circular], + "context": Object {}, + "props": Object {}, + "refs": Object {}, + "state": null, + "updater": Object { + "enqueueCallback": [Function], + "enqueueCallbackInternal": [Function], + "enqueueElementInternal": [Function], + "enqueueForceUpdate": [Function], + "enqueueReplaceState": [Function], + "enqueueSetState": [Function], + "isMounted": [Function], + "validateCallback": [Function], + }, + }, + "_mountOrder": 5, + "_pendingCallbacks": null, + "_pendingElement": null, + "_pendingForceUpdate": false, + "_pendingReplaceState": false, + "_pendingStateQueue": null, + "_renderedComponent": NoopInternalComponent { + "_currentElement": , + "_debugID": 10, + "_renderedOutput": , + }, + "_renderedNodeType": 1, + "_rootNodeID": 0, + "_topLevelWrapper": null, + "_updateBatchNumber": null, + "_warnedAboutRefsInRender": false, + }, + "getRenderOutput": [Function], + "render": [Function], + }, + "root": [Circular], + "unrendered": , +} +`; + +exports[`CompactCard should have custom class of \`test__ace\` 1`] = ` +ShallowWrapper { + "complexSelector": ComplexSelector { + "buildPredicate": [Function], + "childrenOfNode": [Function], + "findWhereUnwrapped": [Function], + }, + "length": 1, + "node": , + "nodes": Array [ + , + ], + "options": Object {}, + "renderer": ReactShallowRenderer { + "_instance": ShallowComponentWrapper { + "_calledComponentWillUnmount": false, + "_compositeType": 2, + "_context": Object {}, + "_currentElement": , + "_debugID": 11, + "_hostContainerInfo": null, + "_hostParent": null, + "_instance": StatelessComponent { + "_reactInternalInstance": [Circular], + "context": Object {}, + "props": Object { + "className": "test__ace", + }, + "refs": Object {}, + "state": null, + "updater": Object { + "enqueueCallback": [Function], + "enqueueCallbackInternal": [Function], + "enqueueElementInternal": [Function], + "enqueueForceUpdate": [Function], + "enqueueReplaceState": [Function], + "enqueueSetState": [Function], + "isMounted": [Function], + "validateCallback": [Function], + }, + }, + "_mountOrder": 6, + "_pendingCallbacks": null, + "_pendingElement": null, + "_pendingForceUpdate": false, + "_pendingReplaceState": false, + "_pendingStateQueue": null, + "_renderedComponent": NoopInternalComponent { + "_currentElement": , + "_debugID": 12, + "_renderedOutput": , + }, + "_renderedNodeType": 1, + "_rootNodeID": 0, + "_topLevelWrapper": null, + "_updateBatchNumber": null, + "_warnedAboutRefsInRender": false, + }, + "getRenderOutput": [Function], + "render": [Function], + }, + "root": [Circular], + "unrendered": , +} +`; + +exports[`CompactCard should render children 1`] = ` +ShallowWrapper { + "complexSelector": ComplexSelector { + "buildPredicate": [Function], + "childrenOfNode": [Function], + "findWhereUnwrapped": [Function], + }, + "length": 1, + "node": + This is a compact card + , + "nodes": Array [ + + This is a compact card + , + ], + "options": Object {}, + "renderer": ReactShallowRenderer { + "_instance": ShallowComponentWrapper { + "_calledComponentWillUnmount": false, + "_compositeType": 2, + "_context": Object {}, + "_currentElement": + This is a compact card + , + "_debugID": 13, + "_hostContainerInfo": null, + "_hostParent": null, + "_instance": StatelessComponent { + "_reactInternalInstance": [Circular], + "context": Object {}, + "props": Object { + "children": "This is a compact card", + }, + "refs": Object {}, + "state": null, + "updater": Object { + "enqueueCallback": [Function], + "enqueueCallbackInternal": [Function], + "enqueueElementInternal": [Function], + "enqueueForceUpdate": [Function], + "enqueueReplaceState": [Function], + "enqueueSetState": [Function], + "isMounted": [Function], + "validateCallback": [Function], + }, + }, + "_mountOrder": 7, + "_pendingCallbacks": null, + "_pendingElement": null, + "_pendingForceUpdate": false, + "_pendingReplaceState": false, + "_pendingStateQueue": null, + "_renderedComponent": NoopInternalComponent { + "_currentElement": + This is a compact card + , + "_debugID": 14, + "_renderedOutput": + This is a compact card + , + }, + "_renderedNodeType": 1, + "_rootNodeID": 0, + "_topLevelWrapper": null, + "_updateBatchNumber": null, + "_warnedAboutRefsInRender": false, + }, + "getRenderOutput": [Function], + "render": [Function], + }, + "root": [Circular], + "unrendered": + This is a compact card + , +} +`; + +exports[`CompactCard should use the card component 1`] = ` +ShallowWrapper { + "complexSelector": ComplexSelector { + "buildPredicate": [Function], + "childrenOfNode": [Function], + "findWhereUnwrapped": [Function], + }, + "length": 1, + "node": , + "nodes": Array [ + , + ], + "options": Object {}, + "renderer": ReactShallowRenderer { + "_instance": ShallowComponentWrapper { + "_calledComponentWillUnmount": false, + "_compositeType": 2, + "_context": Object {}, + "_currentElement": , + "_debugID": 15, + "_hostContainerInfo": null, + "_hostParent": null, + "_instance": StatelessComponent { + "_reactInternalInstance": [Circular], + "context": Object {}, + "props": Object {}, + "refs": Object {}, + "state": null, + "updater": Object { + "enqueueCallback": [Function], + "enqueueCallbackInternal": [Function], + "enqueueElementInternal": [Function], + "enqueueForceUpdate": [Function], + "enqueueReplaceState": [Function], + "enqueueSetState": [Function], + "isMounted": [Function], + "validateCallback": [Function], + }, + }, + "_mountOrder": 8, + "_pendingCallbacks": null, + "_pendingElement": null, + "_pendingForceUpdate": false, + "_pendingReplaceState": false, + "_pendingStateQueue": null, + "_renderedComponent": NoopInternalComponent { + "_currentElement": , + "_debugID": 16, + "_renderedOutput": , + }, + "_renderedNodeType": 1, + "_rootNodeID": 0, + "_topLevelWrapper": null, + "_updateBatchNumber": null, + "_warnedAboutRefsInRender": false, + }, + "getRenderOutput": [Function], + "render": [Function], + }, + "root": [Circular], + "unrendered": , +} +`; diff --git a/client/components/card/test/index.js b/client/components/card/test/index.js index dee6d0f28f14b..cfe69a8c60a9a 100644 --- a/client/components/card/test/index.js +++ b/client/components/card/test/index.js @@ -2,7 +2,6 @@ /** * External dependencies */ -import { expect } from 'chai'; import { shallow } from 'enzyme'; import React from 'react'; @@ -16,27 +15,31 @@ describe( 'Card', () => { // it should have a class of `card` test( 'should have `card` class', () => { const card = shallow( ); - expect( card.is( '.card' ) ).to.equal( true ); + expect( card.is( '.card' ) ).toBe( true ); + expect( card ).toMatchSnapshot(); } ); // it should accept a custom class of `test__ace` test( 'should have custom class of `test__ace`', () => { const card = shallow( ); - expect( card.is( '.test__ace' ) ).to.equal( true ); + expect( card.is( '.test__ace' ) ).toBe( true ); + expect( card ).toMatchSnapshot(); } ); // check that content within a card renders correctly test( 'should render children', () => { const card = shallow( This is a card ); - expect( card.contains( 'This is a card' ) ).to.equal( true ); + expect( card.contains( 'This is a card' ) ).toBe( true ); + expect( card ).toMatchSnapshot(); } ); // check it will accept a href test( 'should be linkable', () => { const card = shallow( This is a linked card ); - expect( card.find( 'a[href="/test"]' ) ).to.have.length( 1 ); - expect( card.props().href ).to.equal( '/test' ); - expect( card.is( '.is-card-link' ) ).to.equal( true ); + expect( card.find( 'a[href="/test"]' ) ).toHaveLength( 1 ); + expect( card.props().href ).toBe( '/test' ); + expect( card.is( '.is-card-link' ) ).toBe( true ); + expect( card ).toMatchSnapshot(); } ); } ); @@ -44,24 +47,28 @@ describe( 'CompactCard', () => { // it should have a class of `is-compact` test( 'should have `is-compact` class', () => { const compactCard = shallow( ); - expect( compactCard.find( '.is-compact' ) ).to.have.length( 1 ); + expect( compactCard.find( '.is-compact' ) ).toHaveLength( 1 ); + expect( compactCard ).toMatchSnapshot(); } ); // it should accept a custom class of `test__ace` test( 'should have custom class of `test__ace`', () => { const compactCard = shallow( ); - expect( compactCard.is( '.test__ace' ) ).to.equal( true ); + expect( compactCard.is( '.test__ace' ) ).toBe( true ); + expect( compactCard ).toMatchSnapshot(); } ); - // check that content within a card renders correctly + // check that content within a CompactCard renders correctly test( 'should render children', () => { const compactCard = shallow( This is a compact card ); - expect( compactCard.contains( 'This is a compact card' ) ).to.equal( true ); + expect( compactCard.contains( 'This is a compact card' ) ).toBe( true ); + expect( compactCard ).toMatchSnapshot(); } ); // test for card component test( 'should use the card component', () => { const compactCard = shallow( ); - expect( compactCard.find( 'Card' ) ).to.have.length( 1 ); + expect( compactCard.find( 'Card' ) ).toHaveLength( 1 ); + expect( compactCard ).toMatchSnapshot(); } ); } ); diff --git a/client/components/data/query-comment/README.md b/client/components/data/query-comment/README.md index 7e00a9dc2c4bc..c472669d7f7b2 100644 --- a/client/components/data/query-comment/README.md +++ b/client/components/data/query-comment/README.md @@ -22,3 +22,4 @@ const CommentDetail = ( { comment, commentId, siteId } ) => | --- | --- | --- | | `commentId` | Number | The comment to request. | | `siteId` | Number | The site ID for which the comment should be queried. | +| `forceWpcom` | Bool | (default: false) Forces the request to wpcom. | diff --git a/client/components/data/query-comment/index.jsx b/client/components/data/query-comment/index.jsx index 132ecf0a0b980..14452092b7019 100644 --- a/client/components/data/query-comment/index.jsx +++ b/client/components/data/query-comment/index.jsx @@ -16,9 +16,14 @@ import { requestComment } from 'state/comments/actions'; export class QueryComment extends Component { static propTypes = { commentId: PropTypes.number, + forceWpcom: PropTypes.bool, siteId: PropTypes.number, }; + static defaultProps = { + forceWpcom: false, + }; + componentDidMount() { this.request(); } @@ -30,9 +35,11 @@ export class QueryComment extends Component { } request() { - const { siteId, commentId } = this.props; + const { siteId, commentId, forceWpcom } = this.props; if ( siteId && commentId ) { - this.props.requestComment( { siteId, commentId } ); + const query = forceWpcom ? { force: 'wpcom' } : {}; + + this.props.requestComment( { siteId, commentId, query } ); } } diff --git a/client/components/data/query-jetpack-credentials/index.jsx b/client/components/data/query-jetpack-credentials/index.jsx new file mode 100644 index 0000000000000..fba843e93418c --- /dev/null +++ b/client/components/data/query-jetpack-credentials/index.jsx @@ -0,0 +1,40 @@ +/** + * External dependencies + */ +import PropTypes from 'prop-types'; +import { Component } from 'react'; +import { connect } from 'react-redux'; + +/** + * Internal dependencies + */ +import { requestCredentials } from 'state/jetpack/credentials/actions'; + +class QueryJetpackCredentials extends Component { + componentWillMount() { + this.request( this.props ); + } + + componentWillReceiveProps( nextProps ) { + if ( this.props.siteId === nextProps.siteId ) { + return; + } + + this.request( nextProps ); + } + + request( props ) { + this.props.requestCredentials( props.siteId ); + } + + render() { + return null; + } +} + +QueryJetpackCredentials.propTypes = { + requestCredentials: PropTypes.func.isRequired, + siteId: PropTypes.number.isRequired +}; + +export default connect( null, { requestCredentials } )( QueryJetpackCredentials ); diff --git a/client/components/data/query-rewind-restore-status/index.js b/client/components/data/query-rewind-restore-status/index.js index a43dcb22d8b8b..5e0db002e60b9 100644 --- a/client/components/data/query-rewind-restore-status/index.js +++ b/client/components/data/query-rewind-restore-status/index.js @@ -20,7 +20,7 @@ class QueryRewindRestoreStatus extends PureComponent { queryDelay: PropTypes.number.isRequired, restoreId: PropTypes.number, siteId: PropTypes.number.isRequired, - timestamp: PropTypes.number.isRequired, + timestamp: PropTypes.string.isRequired, }; static defaultProps = { diff --git a/client/components/dialog/dialog-base.jsx b/client/components/dialog/dialog-base.jsx index 2c8735d019d9e..0e2137e346dda 100644 --- a/client/components/dialog/dialog-base.jsx +++ b/client/components/dialog/dialog-base.jsx @@ -1,14 +1,17 @@ +/** @format */ /** * External dependencies - * - * @format */ - import React, { Component } from 'react'; +import PropTypes from 'prop-types'; import Modal from 'react-modal'; import classnames from 'classnames'; class DialogBase extends Component { + static propTypes = { + shouldCloseOnEsc: PropTypes.bool, + }; + static defaultProps = { baseClassName: 'dialog', isFullScreen: true, @@ -17,7 +20,7 @@ class DialogBase extends Component { }; render() { - const { additionalClassNames, baseClassName, isFullScreen } = this.props, + const { additionalClassNames, baseClassName, isFullScreen, shouldCloseOnEsc } = this.props, contentClassName = baseClassName + '__content', // Previous implementation used a ``, styling still relies on the 'card' class being present dialogClassName = classnames( baseClassName, 'card', additionalClassNames ), @@ -34,6 +37,7 @@ class DialogBase extends Component { overlayClassName={ backdropClassName } // We use flex here which react-modal doesn't className={ dialogClassName } role="dialog" + shouldCloseOnEsc={ shouldCloseOnEsc } >
    , small: }; + let components = { a: , small: }; if ( isNextDomainFree( this.props.cart ) ) { - mappingOffer = translate( + offer = translate( '{{small}}If you purchased %(domain)s elsewhere, you can {{a}}map it{{/a}} for free.{{/small}}', { args: { domain }, components } ); } else if ( ! this.props.domainsWithPlansOnly || this.props.isSiteOnPaidPlan ) { - mappingOffer = translate( + offer = translate( '{{small}}If you purchased %(domain)s elsewhere, you can {{a}}map it{{/a}} for %(cost)s.{{/small}}', { args: { domain, cost: this.props.products.domain_map.cost_display }, components } ); } else { - mappingOffer = translate( + offer = translate( '{{small}}If you purchased %(domain)s elsewhere, you can {{a}}map it{{/a}} with WordPress.com Premium.{{/small}}', { args: { domain }, components } ); } + if ( this.props.transferInAllowed ) { + components = { a: , small: }; + + if ( isNextDomainFree( this.props.cart ) ) { + offer = translate( + '{{small}}If you purchased %(domain)s elsewhere, you can {{a}}transfer it{{/a}} for free.{{/small}}', + { args: { domain }, components } + ); + } else if ( ! this.props.domainsWithPlansOnly || this.props.isSiteOnPaidPlan ) { + offer = translate( + '{{small}}If you purchased %(domain)s elsewhere, you can {{a}}transfer it{{/a}}.{{/small}}', + { args: { domain }, components } + ); + } else { + offer = translate( + '{{small}}If you purchased %(domain)s elsewhere, you can {{a}}transfer it{{/a}} ' + + 'with WordPress.com Premium.{{/small}}', + { args: { domain }, components } + ); + } + } + const domainUnavailableMessage = lastDomainStatus === UNKNOWN ? translate( '.%(tld)s domains are not offered on WordPress.com.', { @@ -108,10 +135,10 @@ class DomainSearchResults extends React.Component { } ) : translate( '%(domain)s is taken.', { args: { domain } } ); - if ( this.props.offerMappingOption ) { + if ( this.props.offerUnavailableOption ) { availabilityElement = ( - { domainUnavailableMessage } { mappingOffer } + { domainUnavailableMessage } { offer } ); } @@ -131,6 +158,10 @@ class DomainSearchResults extends React.Component { this.props.onAddMapping( this.props.lastDomainSearched ); }; + handleAddTransfer = () => { + this.props.onAddTransfer( this.props.lastDomainSearched ); + }; + renderPlaceholders() { return times( this.props.placeholderQuantity, function( n ) { return ; @@ -138,7 +169,8 @@ class DomainSearchResults extends React.Component { } renderDomainSuggestions() { - let suggestionElements, mappingOffer; + let suggestionElements; + let unavailableOffer; if ( this.props.suggestions.length ) { suggestionElements = this.props.suggestions.map( function( suggestion, i ) { @@ -165,8 +197,8 @@ class DomainSearchResults extends React.Component { ); }, this ); - if ( this.props.offerMappingOption ) { - mappingOffer = ( + if ( this.props.offerUnavailableOption ) { + unavailableOffer = ( ); + + if ( this.props.transferInAllowed ) { + unavailableOffer = ( + + ); + } } } else { suggestionElements = this.renderPlaceholders(); @@ -184,7 +222,7 @@ class DomainSearchResults extends React.Component { return (
    { suggestionElements } - { mappingOffer } + { unavailableOffer }
    ); } @@ -203,6 +241,7 @@ const mapStateToProps = state => { const selectedSiteId = getSelectedSiteId( state ); return { isSiteOnPaidPlan: isSiteOnPaidPlan( state, selectedSiteId ), + transferInAllowed: currentUserHasFlag( state, TRANSFER_IN ), }; }; diff --git a/client/components/domains/domain-search-results/style.scss b/client/components/domains/domain-search-results/style.scss index 78be9036d4315..69acbee11bcc1 100644 --- a/client/components/domains/domain-search-results/style.scss +++ b/client/components/domains/domain-search-results/style.scss @@ -1,4 +1,4 @@ -.domain-search-results__domain-availability { +.domain-search-results__domain-availability, .transfer-domain-step__domain-availability { .notice.is-success { margin: 0; } diff --git a/client/components/domains/domain-suggestion/index.jsx b/client/components/domains/domain-suggestion/index.jsx index b62e786195b1c..d33f086c3a710 100644 --- a/client/components/domains/domain-suggestion/index.jsx +++ b/client/components/domains/domain-suggestion/index.jsx @@ -20,13 +20,14 @@ class DomainSuggestion extends React.Component { buttonClasses: PropTypes.string, extraClasses: PropTypes.string, onButtonClick: PropTypes.func.isRequired, - priceRule: PropTypes.string.isRequired, + priceRule: PropTypes.string, price: PropTypes.string, domain: PropTypes.string, + hidePrice: PropTypes.bool, }; render() { - const { price, isAdded, extraClasses, children, priceRule } = this.props; + const { hidePrice, price, isAdded, extraClasses, children, priceRule } = this.props; const classes = classNames( 'domain-suggestion', 'card', @@ -47,7 +48,7 @@ class DomainSuggestion extends React.Component { >
    { children } - + { ! hidePrice && }
    { this.props.buttonContent }
    diff --git a/client/components/domains/domain-transfer-suggestion/index.jsx b/client/components/domains/domain-transfer-suggestion/index.jsx new file mode 100644 index 0000000000000..15a8eb3049bc9 --- /dev/null +++ b/client/components/domains/domain-transfer-suggestion/index.jsx @@ -0,0 +1,52 @@ +/** + * External dependencies + * + * @format + */ +import PropTypes from 'prop-types'; +import React from 'react'; +import { localize } from 'i18n-calypso'; + +/** + * Internal dependencies + */ +import DomainSuggestion from 'components/domains/domain-suggestion'; + +class DomainTransferSuggestion extends React.Component { + static propTypes = { + onButtonClick: PropTypes.func.isRequired, + }; + + render() { + const { translate } = this.props; + const buttonContent = translate( 'Use a domain I own', { + context: 'Domain transfer or mapping suggestion button', + } ); + + return ( + +
    +

    + { translate( 'Already own a domain?', { + context: 'Upgrades: Register domain header', + comment: 'Asks if you already own a domain name.', + } ) } +

    +

    + { translate( "Transfer or map it to use it as your site's address.", { + context: 'Upgrades: Register domain description', + comment: 'Explains how you could use an existing domain name with your site.', + } ) } +

    +
    +
    + ); + } +} + +export default localize( DomainTransferSuggestion ); diff --git a/client/components/domains/domain-transfer-suggestion/style.scss b/client/components/domains/domain-transfer-suggestion/style.scss new file mode 100644 index 0000000000000..ccbe9d3d48749 --- /dev/null +++ b/client/components/domains/domain-transfer-suggestion/style.scss @@ -0,0 +1,21 @@ +.domain-transfer-suggestion { + display: flex; +} + +.domain-transfer-suggestion__domain-description { + @include breakpoint( ">660px" ) { + width: 75%; + } + + > p { + color: $gray-dark; + font-size: 12px; + font-weight: 600; + margin-bottom: 0; + opacity: 0.7; + + @include breakpoint( ">960px" ) { + margin-bottom: 8px; + } + } +} diff --git a/client/components/domains/map-domain-step/index.jsx b/client/components/domains/map-domain-step/index.jsx index 87e3b0417a328..b3a1b5ce2b1e1 100644 --- a/client/components/domains/map-domain-step/index.jsx +++ b/client/components/domains/map-domain-step/index.jsx @@ -78,9 +78,9 @@ class MapDomainStep extends React.Component { render() { const suggestion = this.props.products.domain_map ? { - cost: this.props.products.domain_map.cost_display, - product_slug: this.props.products.domain_map.product_slug, - } + cost: this.props.products.domain_map.cost_display, + product_slug: this.props.products.domain_map.product_slug, + } : { cost: null, product_slug: '' }; const { translate } = this.props; diff --git a/client/components/domains/register-domain-step/index.jsx b/client/components/domains/register-domain-step/index.jsx index 4b7e4514b71b2..76c3c4eee4bbe 100644 --- a/client/components/domains/register-domain-step/index.jsx +++ b/client/components/domains/register-domain-step/index.jsx @@ -36,6 +36,7 @@ import { getAvailabilityNotice } from 'lib/domains/registration/availability-mes import SearchCard from 'components/search-card'; import DomainRegistrationSuggestion from 'components/domains/domain-registration-suggestion'; import DomainMappingSuggestion from 'components/domains/domain-mapping-suggestion'; +import DomainTransferSuggestion from 'components/domains/domain-transfer-suggestion'; import DomainSuggestion from 'components/domains/domain-suggestion'; import DomainSearchResults from 'components/domains/domain-search-results'; import ExampleDomainSuggestions from 'components/domains/example-domain-suggestions'; @@ -47,6 +48,8 @@ import { getDomainsSuggestionsError, } from 'state/domains/suggestions/selectors'; import { composeAnalytics, recordGoogleEvent, recordTracksEvent } from 'state/analytics/actions'; +import { currentUserHasFlag } from 'state/current-user/selectors'; +import { TRANSFER_IN } from 'state/current-user/constants'; const domains = wpcom.domains(); @@ -133,6 +136,7 @@ class RegisterDomainStep extends React.Component { onSave: PropTypes.func, onAddMapping: PropTypes.func, onAddDomain: PropTypes.func, + onAddTransfer: PropTypes.func, designType: PropTypes.string, }; @@ -608,7 +612,7 @@ class RegisterDomainStep extends React.Component { initialSuggestions() { let domainRegistrationSuggestions; - let domainMappingSuggestion; + let domainUnavailableSuggestion; let suggestions; if ( this.isLoadingSuggestions() || isEmpty( this.props.products ) ) { @@ -633,7 +637,7 @@ class RegisterDomainStep extends React.Component { ); }, this ); - domainMappingSuggestion = ( + domainUnavailableSuggestion = ( ); + + if ( this.props.transferInAllowed ) { + domainUnavailableSuggestion = ( + + ); + } } return ( @@ -651,7 +661,7 @@ class RegisterDomainStep extends React.Component { className="register-domain-step__domain-suggestions" > { domainRegistrationSuggestions } - { domainMappingSuggestion } + { domainUnavailableSuggestion }
    ); } @@ -700,10 +710,12 @@ class RegisterDomainStep extends React.Component { onAddMapping={ onAddMapping } onClickResult={ this.props.onAddDomain } onClickMapping={ this.goToMapDomainStep } + onAddTransfer={ this.props.onAddTransfer } + onClickTransfer={ this.goToTransferDomainStep } suggestions={ suggestions } products={ this.props.products } selectedSite={ this.props.selectedSite } - offerMappingOption={ this.props.offerMappingOption } + offerUnavailableOption={ this.props.offerUnavailableOption } placeholderQuantity={ SUGGESTION_QUANTITY } isSignupStep={ this.props.isSignupStep } railcarSeed={ this.state.railcarSeed } @@ -729,6 +741,22 @@ class RegisterDomainStep extends React.Component { return mapDomainUrl; } + getTransferDomainUrl() { + let transferDomainUrl; + + if ( this.props.transferDomainUrl ) { + transferDomainUrl = this.props.transferDomainUrl; + } else { + const query = qs.stringify( { initialQuery: this.state.lastQuery.trim() } ); + transferDomainUrl = `${ this.props.basePath }/transfer`; + if ( this.props.selectedSite ) { + transferDomainUrl += `/${ this.props.selectedSite.slug }?${ query }`; + } + } + + return transferDomainUrl; + } + goToMapDomainStep = event => { event.preventDefault(); @@ -737,6 +765,14 @@ class RegisterDomainStep extends React.Component { page( this.getMapDomainUrl() ); }; + goToTransferDomainStep = event => { + event.preventDefault(); + + this.props.recordTransferDomainButtonClick( this.props.analyticsSection ); + + page( this.getTransferDomainUrl() ); + }; + showValidationErrorMessage( domain, error ) { const { message, severity } = getAvailabilityNotice( domain, error ); this.setState( { notice: message, noticeSeverity: severity } ); @@ -749,6 +785,12 @@ const recordMapDomainButtonClick = section => recordTracksEvent( 'calypso_domain_search_results_mapping_button_click', { section } ) ); +const recordTransferDomainButtonClick = section => + composeAnalytics( + recordGoogleEvent( 'Domain Search', 'Clicked "Use a Domain I own" Button' ), + recordTracksEvent( 'calypso_domain_search_results_transfer_button_click', { section } ) + ); + const recordSearchFormSubmit = ( searchBoxValue, section, timeDiffFromLastSearch, count, vendor ) => composeAnalytics( recordGoogleEvent( @@ -818,6 +860,7 @@ export default connect( currentUser: getCurrentUser( state ), defaultSuggestions: getDomainsSuggestions( state, queryObject ), defaultSuggestionsError: getDomainsSuggestionsError( state, queryObject ), + transferInAllowed: currentUserHasFlag( state, TRANSFER_IN ), }; }, { @@ -826,5 +869,6 @@ export default connect( recordSearchFormSubmit, recordSearchFormView, recordSearchResultsReceive, + recordTransferDomainButtonClick, } )( localize( RegisterDomainStep ) ); diff --git a/client/components/domains/registrant-extra-info/fr-form.jsx b/client/components/domains/registrant-extra-info/fr-form.jsx index 84d702dce3ce6..0ff356552781e 100644 --- a/client/components/domains/registrant-extra-info/fr-form.jsx +++ b/client/components/domains/registrant-extra-info/fr-form.jsx @@ -9,7 +9,7 @@ import React from 'react'; import { connect } from 'react-redux'; import { localize } from 'i18n-calypso'; import debugFactory from 'debug'; -import { castArray, defaults, get, identity, isEmpty, isString, map, noop } from 'lodash'; +import { castArray, defaults, get, identity, isEmpty, isString, map, noop, toUpper } from 'lodash'; /** * Internal dependencies @@ -34,6 +34,14 @@ function onlyNumericCharacters( string ) { return isString( string ) ? string.replace( /[^0-9]/g, '' ) : ''; } +/* + * Sanitize a VAT string by removing everything except digits, + * letters, plus or star symbols. + */ +export function sanitizeVat( string ) { + return isString( string ) ? toUpper( string ).replace( /[^0-9A-Z+*]/g, '' ) : ''; +} + // If we set a field to null, react decides it's uncontrolled and complains // and we don't particularly want to make the parent remember all our fields // so we use these values to plug missing. @@ -66,6 +74,7 @@ class RegistrantExtraInfoFrForm extends React.PureComponent { sanitizeFunctions = { sirenSiret: onlyNumericCharacters, trademarkNumber: onlyNumericCharacters, + registrantVatId: sanitizeVat, }; componentWillMount() { @@ -160,7 +169,7 @@ class RegistrantExtraInfoFrForm extends React.PureComponent { translate( 'The VAT Number field is a pattern ' + 'of letters and numbers that depends on the country, ' + - 'but it always includes a 2 letter country code' + 'but it always starts with a 2 letter country code' ) ); diff --git a/client/components/domains/registrant-extra-info/fr-schema.json b/client/components/domains/registrant-extra-info/fr-schema.json index b3344d4c72065..7a922916594ae 100644 --- a/client/components/domains/registrant-extra-info/fr-schema.json +++ b/client/components/domains/registrant-extra-info/fr-schema.json @@ -32,8 +32,34 @@ "registrantVatId": { "type": "string", "anyOf": [ - { "pattern": "^[a-zA-Z]{2}.{2}[0-9]{2,10}[a-zA-Z0-9]{4}$" }, - { "pattern": "^.*GB.*$" }, + { "pattern": "^(AT)U[0-9]{8}$" }, + { "pattern": "^(BE)0[0-9]{9}$" }, + { "pattern": "^(BG)[0-9]{9,10}$" }, + { "pattern": "^(CY)[0-9]{8}L$" }, + { "pattern": "^(CZ)[0-9]{8,10}$" }, + { "pattern": "^(DE)[0-9]{9}$" }, + { "pattern": "^(DK)[0-9]{8}$" }, + { "pattern": "^(EE)[0-9]{9}$" }, + { "pattern": "^(EL|GR)[0-9]{9}$" }, + { "pattern": "^(ES)[0-9A-Z][0-9]{7}[0-9A-Z]$" }, + { "pattern": "^(FI)[0-9]{8}$" }, + { "pattern": "^(FR)[0-9A-Z]{2}[0-9]{9}$" }, + { "pattern": "^(GB)([0-9]{9}([0-9]{3})?|(GD|HA)[0-9]{3})$" }, + { "pattern": "^(HR)[0-9]{11}$" }, + { "pattern": "^(HU)[0-9]{8}$" }, + { "pattern": "^(IE)([0-9][0-9A-Z+*][0-9]{5}[A-Z]|[0-9]{7}[0-9A-Z]{1,2})$" }, + { "pattern": "^(IT)[0-9]{11}$" }, + { "pattern": "^(LT)[0-9]{9}([0-9]{3})?$" }, + { "pattern": "^(LU)[0-9]{8}$" }, + { "pattern": "^(LV)[0-9]{11}$" }, + { "pattern": "^(MT)[0-9]{8}$" }, + { "pattern": "^(NL)[0-9]{9}B[0-9]{2}$" }, + { "pattern": "^(PL)[0-9]{10}$" }, + { "pattern": "^(PT)[0-9]{9}$" }, + { "pattern": "^(RO)[0-9]{2,10}$" }, + { "pattern": "^(SE)[0-9]{12}$" }, + { "pattern": "^(SI)[0-9]{8}$" }, + { "pattern": "^(SK)[0-9]{10}$" }, { "$ref": "#/definitions/empty" } ] }, diff --git a/client/components/domains/registrant-extra-info/test/fr-form.js b/client/components/domains/registrant-extra-info/test/fr-form.js new file mode 100644 index 0000000000000..33c25b3b09d34 --- /dev/null +++ b/client/components/domains/registrant-extra-info/test/fr-form.js @@ -0,0 +1,82 @@ +/** @format */ +/** + * External dependencies + */ +import { expect } from 'chai'; + +/** + * Internal dependencies + */ +import { sanitizeVat } from '../fr-form'; + +describe( 'fr-form', () => { + describe( 'VAT Sanitation', () => { + test( 'should clean invalid characters', () => { + const vatPatterns = [ + { before: 'FR 99999999999', after: 'FR99999999999' }, + { before: ' FR99999999999', after: 'FR99999999999' }, + { before: 'FR99999999999 ', after: 'FR99999999999' }, + { before: ' FR99 999 9 99999 ', after: 'FR99999999999' }, + { before: ' FR99@99!99&999()99 ', after: 'FR99999999999' }, + { before: 'Atu99999999', after: 'ATU99999999' }, + ]; + + vatPatterns.forEach( ( { before, after } ) => + expect( sanitizeVat( before ) ).to.eql( after ) + ); + } ); + + test( 'should preserve valid patterns', () => { + // [ pattern, optionalDescription ] + // These are just patterns, not valid numbers. + const validVatPatterns = [ + [ 'ATU99999999' ], + [ 'BE0999999999' ], + [ 'BG999999999' ], + [ 'BG9999999999' ], + [ 'CY99999999L' ], + [ 'CZ99999999' ], + [ 'CZ999999999' ], + [ 'CZ9999999999' ], + [ 'DE999999999' ], + [ 'DK99999999' ], + [ 'EE999999999' ], + [ 'EL999999999' ], + [ 'ESX9999999X' ], + [ 'ES99999999X' ], + [ 'FI99999999' ], + [ 'FRXX999999999' ], + [ 'FR99999999999' ], + [ 'HR99999999999' ], + [ 'HU99999999' ], + [ 'IE9+99999L', 'special character' ], + [ 'IE9*99999L', 'special character' ], + [ 'IE9X99999L' ], + [ 'IE9999999L' ], + [ 'IE9999999WI' ], + [ 'IT99999999999' ], + [ 'LT999999999' ], + [ 'LT999999999999' ], + [ 'LU99999999' ], + [ 'LV99999999999' ], + [ 'MT99999999' ], + [ 'NL999999999B99', 'extra alphanumeric character' ], + [ 'PL9999999999' ], + [ 'PT999999999' ], + [ 'RO999999999' ], + [ 'SE999999999999' ], + [ 'SI99999999' ], + [ 'SK9999999999' ], + // GB :( + [ 'GB999999999' ], + [ 'GB999999999999' ], + [ 'GBGD9996' ], + [ 'GBHA9997' ], + ]; + + validVatPatterns.forEach( ( [ pattern, description ] ) => + expect( sanitizeVat( pattern ) ).to.eql( pattern.toUpperCase(), description ) + ); + } ); + } ); +} ); diff --git a/client/components/domains/registrant-extra-info/test/fr-validate-contact-details.js b/client/components/domains/registrant-extra-info/test/fr-validate-contact-details.js index b4be3374eb827..3b6ec385dcb29 100644 --- a/client/components/domains/registrant-extra-info/test/fr-validate-contact-details.js +++ b/client/components/domains/registrant-extra-info/test/fr-validate-contact-details.js @@ -26,7 +26,7 @@ describe( 'validateContactDetails', () => { phone: '+1.2506382995', extra: { sirenSiret: '123456789', - registrantVatId: 'FRXX12345678901234', + registrantVatId: 'FRXX123456789', trademarkNumber: '123456789', }, }; @@ -94,7 +94,7 @@ describe( 'validateContactDetails', () => { } ); } ); - describe( 'VAT', () => { + describe( 'VAT Validation', () => { test( 'should accept VAT patterns', () => { const vatPatterns = [ [ 'ATU99999999' ], @@ -109,8 +109,8 @@ describe( 'validateContactDetails', () => { [ 'DK99999999' ], [ 'EE999999999' ], [ 'EL999999999' ], - [ 'ESX9999999X4' ], - [ 'ES99999999X4' ], + [ 'ESX9999999X' ], + [ 'ES99999999X' ], [ 'FI99999999' ], [ 'FRXX999999999' ], [ 'FR99999999999' ], @@ -127,20 +127,18 @@ describe( 'validateContactDetails', () => { [ 'LU99999999' ], [ 'LV99999999999' ], [ 'MT99999999' ], - [ 'NL999999999B998', 'extra alphanumeric character' ], + [ 'NL999999999B99', 'extra alphanumeric character' ], [ 'PL9999999999' ], [ 'PT999999999' ], [ 'RO999999999' ], [ 'SE999999999999' ], [ 'SI99999999' ], [ 'SK9999999999' ], - [ 'sk9999999999', 'lowercase' ], // GB :( - [ '999999GB999' ], [ 'GB999999999' ], - [ 'GB9999999999995' ], - [ 'GBGD9996' ], - [ 'GBHA9997' ], + [ 'GB999999999999' ], + [ 'GBGD999' ], + [ 'GBHA999' ], ]; vatPatterns.forEach( ( [ registrantVatId ] ) => { diff --git a/client/components/domains/transfer-domain-step/index.jsx b/client/components/domains/transfer-domain-step/index.jsx new file mode 100644 index 0000000000000..8df150ecaa455 --- /dev/null +++ b/client/components/domains/transfer-domain-step/index.jsx @@ -0,0 +1,260 @@ +/** + * External dependencies + * + * @format + */ +import PropTypes from 'prop-types'; +import React from 'react'; +import { connect } from 'react-redux'; +import { localize } from 'i18n-calypso'; +import { endsWith, get, noop } from 'lodash'; +import Gridicon from 'gridicons'; +import page from 'page'; +import qs from 'qs'; + +/** + * Internal dependencies + */ +import { getFixedDomainSearch, checkDomainAvailability } from 'lib/domains'; +import { domainAvailability } from 'lib/domains/constants'; +import { getAvailabilityNotice } from 'lib/domains/registration/availability-messages'; +import DomainRegistrationSuggestion from 'components/domains/domain-registration-suggestion'; +import { getCurrentUser } from 'state/current-user/selectors'; +import { + recordAddDomainButtonClickInMapDomain, + recordFormSubmitInMapDomain, + recordInputFocusInMapDomain, + recordGoButtonClickInMapDomain, +} from 'state/domains/actions'; +import Notice from 'components/notice'; +import { composeAnalytics, recordGoogleEvent, recordTracksEvent } from 'state/analytics/actions'; +import { getSelectedSite } from 'state/ui/selectors'; + +class TransferDomainStep extends React.Component { + static propTypes = { + products: PropTypes.object.isRequired, + cart: PropTypes.object, + selectedSite: PropTypes.oneOfType( [ PropTypes.object, PropTypes.bool ] ), + initialQuery: PropTypes.string, + analyticsSection: PropTypes.string.isRequired, + domainsWithPlansOnly: PropTypes.bool.isRequired, + onRegisterDomain: PropTypes.func.isRequired, + onTransferDomain: PropTypes.func.isRequired, + onSave: PropTypes.func, + }; + + static defaultProps = { + onSave: noop, + analyticsSection: 'domains', + }; + + state = this.getDefaultState(); + + getDefaultState() { + return { + searchQuery: this.props.initialQuery || '', + }; + } + + componentWillMount() { + if ( this.props.initialState ) { + this.setState( Object.assign( {}, this.props.initialState, this.getDefaultState() ) ); + } + } + + componentWillUnmount() { + this.props.onSave( this.state ); + } + + notice() { + if ( this.state.notice ) { + return ( + + ); + } + } + + getMapDomainUrl() { + const { basePath, selectedSite } = this.props; + let mapDomainUrl; + + const basePathForMapping = endsWith( basePath, '/transfer' ) + ? basePath.substring( 0, basePath.length - 9 ) + : basePath; + + const query = qs.stringify( { initialQuery: this.state.searchQuery.trim() } ); + mapDomainUrl = `${ basePathForMapping }/mapping`; + if ( selectedSite ) { + mapDomainUrl += `/${ selectedSite.slug }?${ query }`; + } + + return mapDomainUrl; + } + + goToMapDomainStep = event => { + event.preventDefault(); + + this.props.recordMapDomainButtonClick( this.props.analyticsSection ); + + page( this.getMapDomainUrl() ); + }; + + render() { + const cost = this.props.products.domain_map + ? this.props.products.domain_map.cost_display + : null; + const { translate } = this.props; + + return ( + + ); + } + + domainRegistrationUpsell() { + const { suggestion } = this.state; + if ( ! suggestion ) { + return; + } + + return ( +
    + + { this.props.translate( '%(domain)s is available!', { + args: { domain: suggestion.domain_name }, + } ) } + + +
    + ); + } + + registerSuggestedDomain = () => { + this.props.recordAddDomainButtonClickInMapDomain( + this.state.suggestion.domain_name, + this.props.analyticsSection + ); + + return this.props.onRegisterDomain( this.state.suggestion ); + }; + + recordInputFocus = () => { + this.props.recordInputFocusInMapDomain( this.state.searchQuery ); + }; + + recordGoButtonClick = () => { + this.props.recordGoButtonClickInMapDomain( + this.state.searchQuery, + this.props.analyticsSection + ); + }; + + setSearchQuery = event => { + this.setState( { searchQuery: event.target.value } ); + }; + + handleFormSubmit = event => { + event.preventDefault(); + + const domain = getFixedDomainSearch( this.state.searchQuery ); + this.props.recordFormSubmitInMapDomain( this.state.searchQuery ); + this.setState( { suggestion: null, notice: null } ); + + checkDomainAvailability( domain, ( error, result ) => { + const status = get( result, 'status', error ); + switch ( status ) { + case domainAvailability.MAPPABLE: + case domainAvailability.UNKNOWN: + this.props.onTransferDomain( domain ); + return; + + case domainAvailability.AVAILABLE: + this.setState( { suggestion: result } ); + return; + + default: + const { message, severity } = getAvailabilityNotice( domain, status ); + this.setState( { notice: message, noticeSeverity: severity } ); + return; + } + } ); + }; +} + +const recordMapDomainButtonClick = section => + composeAnalytics( + recordGoogleEvent( 'Domain Search', 'Clicked "Map it" Button' ), + recordTracksEvent( 'calypso_domain_search_results_mapping_button_click', { section } ) + ); + +export default connect( + state => ( { + currentUser: getCurrentUser( state ), + selectedSite: getSelectedSite( state ), + } ), + { + recordAddDomainButtonClickInMapDomain, + recordFormSubmitInMapDomain, + recordInputFocusInMapDomain, + recordGoButtonClickInMapDomain, + recordMapDomainButtonClick, + } +)( localize( TransferDomainStep ) ); diff --git a/client/components/domains/transfer-domain-step/style.scss b/client/components/domains/transfer-domain-step/style.scss new file mode 100644 index 0000000000000..055c28a3dcaa9 --- /dev/null +++ b/client/components/domains/transfer-domain-step/style.scss @@ -0,0 +1,68 @@ +.transfer-domain-step { + padding: 0; + + form.transfer-domain-step__form { + padding: 20px; + margin-bottom: 9px; + } + + p { + color: $gray-dark; + font-size: 13px; + font-weight: 600; + margin-bottom: 0; + opacity: 0.7; + } + + .domain-product-price { + float: left; + margin-bottom: 20px; + min-width: 0; + + @include breakpoint( ">960px" ) { + float: right; + margin-bottom: 0; + } + } + + .notice { + margin-top: 25px; + } + + .transfer-domain-step__domain-availability { + margin-top: 30px; + } +} + +.transfer-domain-step__domain-description { + @include breakpoint( ">960px" ) { + max-width: 75%; + float: left; + margin-bottom: 20px; + } +} + +.transfer-domain-step__add-domain { + display: flex; + flex-flow: column; + width: 100%; + + @include breakpoint( ">660px" ) { + flex-flow: row; + } +} + +input.transfer-domain-step__external-domain { + flex-grow: 1; + width: auto; +} + +.transfer-domain-step__go { + flex-grow: 1; + margin: 10px 0 0 0; + + @include breakpoint( ">660px" ) { + flex-grow: 0; + margin: 0 0 0 10px; + } +} diff --git a/client/components/happychat/button.jsx b/client/components/happychat/button.jsx index e8d893797048c..f76b0140d8aab 100644 --- a/client/components/happychat/button.jsx +++ b/client/components/happychat/button.jsx @@ -17,20 +17,24 @@ import classnames from 'classnames'; * Internal dependencies */ import viewport from 'lib/viewport'; +import { getHappychatAuth } from 'state/happychat/utils'; import { hasUnreadMessages } from 'state/happychat/selectors'; import hasActiveHappychatSession from 'state/happychat/selectors/has-active-happychat-session'; import isHappychatAvailable from 'state/happychat/selectors/is-happychat-available'; -import { connectChat } from 'state/happychat/connection/actions'; +import isHappychatConnectionUninitialized from 'state/happychat/selectors/is-happychat-connection-uninitialized'; +import { initConnection } from 'state/happychat/connection/actions'; import { openChat } from 'state/happychat/ui/actions'; import Button from 'components/button'; -class HappychatButton extends Component { +export class HappychatButton extends Component { static propTypes = { allowMobileRedirect: PropTypes.bool, borderless: PropTypes.bool, - connectChat: PropTypes.func, + getAuth: PropTypes.func, + initConnection: PropTypes.func, isChatActive: PropTypes.bool, isChatAvailable: PropTypes.bool, + isConnectionUninitialized: PropTypes.bool, onClick: PropTypes.func, openChat: PropTypes.func, translate: PropTypes.func, @@ -39,9 +43,11 @@ class HappychatButton extends Component { static defaultProps = { allowMobileRedirect: false, borderless: true, - connectChat: noop, + getAuth: noop, + initConnection: noop, isChatActive: false, isChatAvailable: false, + isConnectionUninitialized: false, onClick: noop, openChat: noop, translate: identity, @@ -60,7 +66,9 @@ class HappychatButton extends Component { }; componentDidMount() { - this.props.connectChat(); + if ( this.props.isConnectionUninitialized ) { + this.props.initConnection( this.props.getAuth() ); + } } render() { @@ -100,11 +108,13 @@ class HappychatButton extends Component { export default connect( state => ( { hasUnread: hasUnreadMessages( state ), + getAuth: getHappychatAuth( state ), isChatAvailable: isHappychatAvailable( state ), isChatActive: hasActiveHappychatSession( state ), + isConnectionUninitialized: isHappychatConnectionUninitialized( state ), } ), { openChat, - connectChat, + initConnection, } )( localize( HappychatButton ) ); diff --git a/client/components/happychat/composer.jsx b/client/components/happychat/composer.jsx index 9855880de4a63..f453be63f7247 100644 --- a/client/components/happychat/composer.jsx +++ b/client/components/happychat/composer.jsx @@ -8,24 +8,19 @@ import React from 'react'; import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { isEmpty } from 'lodash'; +import { get, isEmpty, throttle } from 'lodash'; import { localize } from 'i18n-calypso'; /** * Internal dependencies */ -import { sendChatMessage } from 'state/happychat/connection/actions'; +import { sendMessage } from 'state/happychat/connection/actions'; import { setCurrentMessage } from 'state/happychat/ui/actions'; +import { sendTyping, sendNotTyping } from 'state/happychat/connection/actions'; import getCurrentMessage from 'state/happychat/selectors/get-happychat-current-message'; import { canUserSendMessages } from 'state/happychat/selectors'; -import { when, forEach, compose, propEquals, call, prop } from './functional'; import scrollbleed from './scrollbleed'; -// helper function for detecting when a DOM event keycode is pressed -const returnPressed = propEquals( 'which', 13 ); -// helper function that calls prevents default on the DOM event -const preventDefault = call( 'preventDefault' ); - /* * Renders a textarea to be used to comopose a message for the chat. */ @@ -37,23 +32,47 @@ export const Composer = createReactClass( { disabled: PropTypes.bool, message: PropTypes.string, onFocus: PropTypes.func, - onSendChatMessage: PropTypes.func, - onUpdateChatMessage: PropTypes.func, + onSendMessage: PropTypes.func, + onSendTyping: PropTypes.func, + onSendNotTyping: PropTypes.func, + onSetCurrentMessage: PropTypes.func, translate: PropTypes.func, // localize HOC }, + onChange( event ) { + const { onSendTyping, onSendNotTyping, onSetCurrentMessage } = this.props; + + const sendThrottledTyping = throttle( + msg => { + onSendTyping( msg ); + }, + 1000, + { leading: true, trailing: false } + ); + + const msg = get( event, 'target.value' ); + onSetCurrentMessage( msg ); + isEmpty( msg ) ? onSendNotTyping() : sendThrottledTyping( msg ); + }, + + onKeyDown( event ) { + const RETURN_KEYCODE = 13; + if ( get( event, 'which' ) === RETURN_KEYCODE ) { + event.preventDefault(); + this.sendMessage(); + } + }, + + sendMessage() { + const { message, onSendMessage, onSendNotTyping } = this.props; + if ( ! isEmpty( message ) ) { + onSendMessage( message ); + onSendNotTyping(); + } + }, + render() { - const { - disabled, - message, - onFocus, - onSendChatMessage, - onUpdateChatMessage, - translate, - } = this.props; - const sendMessage = when( () => ! isEmpty( message ), () => onSendChatMessage( message ) ); - const onChange = compose( prop( 'target.value' ), onUpdateChatMessage ); - const onKeyDown = when( returnPressed, forEach( preventDefault, sendMessage ) ); + const { disabled, message, onFocus, translate } = this.props; const composerClasses = classNames( 'happychat__composer', { 'is-disabled': disabled, } ); @@ -70,13 +89,13 @@ export const Composer = createReactClass( { onFocus={ onFocus } type="text" placeholder={ translate( 'Type a message …' ) } - onChange={ onChange } - onKeyDown={ onKeyDown } + onChange={ this.onChange } + onKeyDown={ this.onKeyDown } disabled={ disabled } value={ message } />
    -
    ); @@ -172,14 +174,12 @@ class Dashboard extends Component { render = () => { const { className, loading, selectedSite } = this.props; - if ( loading || ! selectedSite ) { - // TODO have a placeholder/loading view instead - return null; - } - return (
    - + { this.renderDashboardContent() }
    ); @@ -189,14 +189,10 @@ class Dashboard extends Component { function mapStateToProps( state ) { const selectedSite = getSelectedSiteWithFallback( state ); const loading = - areOrdersLoading( state ) || - areSetupChoicesLoading( state ) || - areProductsLoading( state ) || - isRequestingSyncStatus( state ); + areOrdersLoading( state ) || areSetupChoicesLoading( state ) || areProductsLoading( state ); const hasOrders = getNewOrdersWithoutPayPalPending( state ).length > 0; const hasProducts = getTotalProducts( state ) > 0; const productsLoaded = areProductsLoaded( state ); - const mailChimpConfigured = hasMailChimpConnection( state ); const finishedInitialSetup = getFinishedInitialSetup( state ); return { @@ -205,7 +201,6 @@ function mapStateToProps( state ) { finishedPageSetup: getFinishedPageSetup( state ), hasOrders, hasProducts, - mailChimpConfigured, productsLoaded, loading, selectedSite, @@ -219,7 +214,7 @@ function mapDispatchToProps( dispatch ) { fetchOrders, fetchSetupChoices, fetchProducts, - requestSyncStatus, + requestSettings, }, dispatch ); diff --git a/client/extensions/woocommerce/app/dashboard/placeholder.js b/client/extensions/woocommerce/app/dashboard/placeholder.js new file mode 100644 index 0000000000000..b280b01179825 --- /dev/null +++ b/client/extensions/woocommerce/app/dashboard/placeholder.js @@ -0,0 +1,29 @@ +/** + * External dependencies + * + * @format + */ + +import React from 'react'; + +/** + * Internal dependencies + */ +import BasicWidget from 'woocommerce/components/basic-widget'; +import WidgetGroup from 'woocommerce/components/widget-group'; + +const DashboardPlaceholder = () => { + const loading = ; + + return ( +
    + + + { loading } + { loading } + +
    + ); +}; + +export default DashboardPlaceholder; diff --git a/client/extensions/woocommerce/app/dashboard/required-pages-setup-view.js b/client/extensions/woocommerce/app/dashboard/required-pages-setup-view.js index ea5135757e86e..a06a75f0f29c8 100644 --- a/client/extensions/woocommerce/app/dashboard/required-pages-setup-view.js +++ b/client/extensions/woocommerce/app/dashboard/required-pages-setup-view.js @@ -40,7 +40,7 @@ class RequiredPagesSetupView extends Component { diff --git a/client/extensions/woocommerce/app/dashboard/required-plugins-install-view.js b/client/extensions/woocommerce/app/dashboard/required-plugins-install-view.js index 964fec1756f5a..978f0e88c1d9d 100644 --- a/client/extensions/woocommerce/app/dashboard/required-plugins-install-view.js +++ b/client/extensions/woocommerce/app/dashboard/required-plugins-install-view.js @@ -9,7 +9,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { find, get } from 'lodash'; +import { find } from 'lodash'; import { localize } from 'i18n-calypso'; /** @@ -26,17 +26,35 @@ import ProgressBar from 'components/progress-bar'; import QueryJetpackPlugins from 'components/data/query-jetpack-plugins'; import SetupHeader from './setup-header'; import { setFinishedInstallOfRequiredPlugins } from 'woocommerce/state/sites/setup-choices/actions'; -import { getSiteOptions } from 'state/selectors'; +import { hasSitePendingAutomatedTransfer } from 'state/selectors'; import { getAutomatedTransferStatus } from 'state/automated-transfer/selectors'; import { transferStates } from 'state/automated-transfer/constants'; // Time in seconds to complete various steps. -const TIME_TO_TRANSFER_ELIGIBILITY = 5; +const TIME_TO_TRANSFER_ACTIVE = 5; const TIME_TO_TRANSFER_UPLOADING = 5; const TIME_TO_TRANSFER_BACKFILLING = 25; const TIME_TO_TRANSFER_COMPLETE = 6; const TIME_TO_PLUGIN_INSTALLATION = 15; +const transferStatusesToTimes = {}; + +transferStatusesToTimes[ transferStates.PENDING ] = TIME_TO_TRANSFER_ACTIVE; + +// ACTIVE and PENDING have the same time because it's a way to show some progress even +// if nothing happened yet (good for UX). +transferStatusesToTimes[ transferStates.ACTIVE ] = + transferStatusesToTimes[ transferStates.PENDING ]; + +transferStatusesToTimes[ transferStates.UPLOADING ] = + TIME_TO_TRANSFER_UPLOADING + transferStatusesToTimes[ transferStates.ACTIVE ]; + +transferStatusesToTimes[ transferStates.BACKFILLING ] = + TIME_TO_TRANSFER_BACKFILLING + transferStatusesToTimes[ transferStates.UPLOADING ]; + +transferStatusesToTimes[ transferStates.COMPLETE ] = + TIME_TO_TRANSFER_COMPLETE + transferStatusesToTimes[ transferStates.BACKFILLING ]; + class RequiredPluginsInstallView extends Component { static propTypes = { site: PropTypes.shape( { @@ -58,17 +76,17 @@ class RequiredPluginsInstallView extends Component { } componentDidMount = () => { - const { signupIsStore, automatedTransferStatus } = this.props; + const { hasPendingAT, automatedTransferStatus } = this.props; this.createUpdateTimer(); if ( automatedTransferStatus ) { this.setState( { - progress: this.state.progress + TIME_TO_TRANSFER_ELIGIBILITY, + progress: transferStatusesToTimes[ automatedTransferStatus ], } ); } - if ( signupIsStore ) { + if ( hasPendingAT ) { this.startSetup(); } }; @@ -78,37 +96,21 @@ class RequiredPluginsInstallView extends Component { }; componentWillReceiveProps( nextProps ) { - const { ACTIVE, UPLOADING, BACKFILLING, COMPLETE } = transferStates; - const { automatedTransferStatus: currentAutomatedTransferStatus, siteId } = this.props; - const { automatedTransferStatus: nextAutomatedTransferStatus } = nextProps; + const { automatedTransferStatus: currentATStatus, siteId, hasPendingAT } = this.props; + const { automatedTransferStatus: nextATStatus } = nextProps; - if ( ACTIVE === currentAutomatedTransferStatus && UPLOADING === nextAutomatedTransferStatus ) { + if ( hasPendingAT && nextATStatus ) { this.setState( { - progress: this.state.progress + TIME_TO_TRANSFER_UPLOADING, + progress: transferStatusesToTimes[ nextATStatus ], } ); - - return; } - if ( - UPLOADING === currentAutomatedTransferStatus && - BACKFILLING === nextAutomatedTransferStatus - ) { - this.setState( { - progress: this.state.progress + TIME_TO_TRANSFER_BACKFILLING, - } ); - - return; - } + const { BACKFILLING, COMPLETE } = transferStates; - if ( - BACKFILLING === currentAutomatedTransferStatus && - COMPLETE === nextAutomatedTransferStatus - ) { + if ( BACKFILLING === currentATStatus && COMPLETE === nextATStatus ) { this.setState( { engineState: 'INITIALIZING', workingOn: '', - progress: this.state.progress + TIME_TO_TRANSFER_COMPLETE, } ); this.props.fetchPlugins( [ siteId ] ); @@ -366,13 +368,13 @@ class RequiredPluginsInstallView extends Component { } startSetup = () => { - const { signupIsStore } = this.props; + const { hasPendingAT } = this.props; analytics.tracks.recordEvent( 'calypso_woocommerce_dashboard_action_click', { action: 'initial-setup', } ); - if ( ! signupIsStore ) { + if ( ! hasPendingAT ) { this.setState( { engineState: 'INITIALIZING', } ); @@ -405,26 +407,20 @@ class RequiredPluginsInstallView extends Component { }; getTotalSeconds() { - const { signupIsStore } = this.props; - - if ( signupIsStore ) { - return ( - TIME_TO_TRANSFER_ELIGIBILITY + - TIME_TO_TRANSFER_UPLOADING + - TIME_TO_TRANSFER_BACKFILLING + - TIME_TO_TRANSFER_COMPLETE + - TIME_TO_PLUGIN_INSTALLATION - ); + const { hasPendingAT } = this.props; + + if ( hasPendingAT ) { + return transferStatusesToTimes[ transferStates.COMPLETE ] + TIME_TO_PLUGIN_INSTALLATION; } return TIME_TO_PLUGIN_INSTALLATION; } render = () => { - const { site, translate, signupIsStore } = this.props; + const { site, translate, hasPendingAT } = this.props; const { engineState, progress, totalSeconds } = this.state; - if ( ! signupIsStore && 'CONFIRMING' === engineState ) { + if ( ! hasPendingAT && 'CONFIRMING' === engineState ) { return this.renderConfirmScreen(); } @@ -434,11 +430,8 @@ class RequiredPluginsInstallView extends Component { @@ -452,7 +445,6 @@ function mapStateToProps( state ) { const siteId = site.ID; const sitePlugins = site ? getPlugins( state, [ siteId ] ) : []; - const siteOptions = getSiteOptions( state, siteId ); return { site, @@ -460,7 +452,7 @@ function mapStateToProps( state ) { sitePlugins, wporg: state.plugins.wporg.items, automatedTransferStatus: getAutomatedTransferStatus( state, siteId ), - signupIsStore: get( siteOptions, 'signup_is_store', false ), + hasPendingAT: hasSitePendingAutomatedTransfer( state, siteId ), }; } diff --git a/client/extensions/woocommerce/app/dashboard/style.scss b/client/extensions/woocommerce/app/dashboard/style.scss index 655c5fe86589b..ce387bf1314b9 100644 --- a/client/extensions/woocommerce/app/dashboard/style.scss +++ b/client/extensions/woocommerce/app/dashboard/style.scss @@ -1,11 +1,30 @@ .dashboard__manage-has-orders, .dashboard__manage-no-orders, +.dashboard__placeholder, .dashboard__setup-wrapper { @include breakpoint( ">660px" ) { margin-top: 58px; } } +.dashboard__placeholder .card { + @include placeholder(); +} + +.dashboard__placeholder-large button, +.dashboard__placeholder-small button { + display: none; +} + +.dashboard__placeholder-small { + height: 250px; +} + +.dashboard__placeholder-large { + margin-bottom: 16px; + height: 200px; +} + .dashboard__setup-header { text-align: center; padding-top: 16px; diff --git a/client/extensions/woocommerce/app/index.js b/client/extensions/woocommerce/app/index.js index 795410b4fedaa..f8f1cf96ab560 100644 --- a/client/extensions/woocommerce/app/index.js +++ b/client/extensions/woocommerce/app/index.js @@ -17,7 +17,7 @@ import { canCurrentUser } from 'state/selectors'; import config from 'config'; import DocumentHead from 'components/data/document-head'; import { getSelectedSiteId } from 'state/ui/selectors'; -import { isSiteAutomatedTransfer } from 'state/selectors'; +import { isSiteAutomatedTransfer, hasSitePendingAutomatedTransfer } from 'state/selectors'; import route from 'lib/route'; class App extends Component { @@ -27,6 +27,7 @@ class App extends Component { canUserManageOptions: PropTypes.bool.isRequired, currentRoute: PropTypes.string.isRequired, isAtomicSite: PropTypes.bool.isRequired, + hasPendingAutomatedTransfer: PropTypes.bool.isRequired, children: PropTypes.element.isRequired, }; @@ -46,6 +47,7 @@ class App extends Component { children, canUserManageOptions, isAtomicSite, + hasPendingAutomatedTransfer, currentRoute, translate, } = this.props; @@ -62,7 +64,11 @@ class App extends Component { return null; } - if ( ! isAtomicSite && ! config.isEnabled( 'woocommerce/store-on-non-atomic-sites' ) ) { + if ( + ! isAtomicSite && + ! hasPendingAutomatedTransfer && + ! config.isEnabled( 'woocommerce/store-on-non-atomic-sites' ) + ) { this.redirect(); return null; } @@ -89,10 +95,14 @@ function mapStateToProps( state ) { const canUserManageOptions = ( siteId && canCurrentUser( state, siteId, 'manage_options' ) ) || false; const isAtomicSite = ( siteId && !! isSiteAutomatedTransfer( state, siteId ) ) || false; + const hasPendingAutomatedTransfer = + ( siteId && !! hasSitePendingAutomatedTransfer( state, siteId ) ) || false; + return { siteId, canUserManageOptions, isAtomicSite, + hasPendingAutomatedTransfer, currentRoute: page.current, }; } diff --git a/client/extensions/woocommerce/app/order/order-details/add-items.js b/client/extensions/woocommerce/app/order/order-details/add-items.js new file mode 100644 index 0000000000000..c560357623506 --- /dev/null +++ b/client/extensions/woocommerce/app/order/order-details/add-items.js @@ -0,0 +1,45 @@ +/** @format */ +/** + * External dependencies + */ +import React, { Component } from 'react'; +import { localize } from 'i18n-calypso'; +import Gridicon from 'gridicons'; + +/** + * Internal dependencies + */ +import Button from 'components/button'; +import OrderFeeDialog from './fee-dialog'; + +class OrderAddItems extends Component { + state = { + showDialog: false, + }; + + toggleDialog = type => () => { + this.setState( { showDialog: type } ); + }; + + render() { + const { translate } = this.props; + return ( +
    + + + +
    + ); + } +} + +export default localize( OrderAddItems ); diff --git a/client/extensions/woocommerce/app/order/order-details/fee-dialog.js b/client/extensions/woocommerce/app/order/order-details/fee-dialog.js new file mode 100644 index 0000000000000..62239232a23f0 --- /dev/null +++ b/client/extensions/woocommerce/app/order/order-details/fee-dialog.js @@ -0,0 +1,153 @@ +/** @format */ +/** + * External dependencies + */ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import { localize } from 'i18n-calypso'; +import { trim, uniqueId } from 'lodash'; + +/** + * Internal dependencies + */ +import Button from 'components/button'; +import Dialog from 'components/dialog'; +import { editOrder } from 'woocommerce/state/ui/orders/actions'; +import FormLabel from 'components/forms/form-label'; +import FormTextInput from 'components/forms/form-text-input'; +import { getCurrencyFormatDecimal } from 'woocommerce/lib/currency'; +import { getOrderWithEdits } from 'woocommerce/state/ui/orders/selectors'; +import { getSelectedSiteWithFallback } from 'woocommerce/state/sites/selectors'; +import PriceInput from 'woocommerce/components/price-input'; + +class OrderFeeDialog extends Component { + static propTypes = { + isVisible: PropTypes.bool.isRequired, + editOrder: PropTypes.func.isRequired, + order: PropTypes.shape( { + currency: PropTypes.string.isRequired, + id: PropTypes.number.isRequired, + } ), + siteId: PropTypes.number.isRequired, + translate: PropTypes.func.isRequired, + }; + + state = { + name: '', + total: 0, + }; + + componentWillUpdate( nextProps ) { + // Dialog is being closed, clear the state + if ( this.props.isVisible && ! nextProps.isVisible ) { + this.setState( { + name: '', + total: 0, + } ); + } + } + + handleChange = event => { + const value = event.target.value; + switch ( event.target.name ) { + case 'new_fee_name': + this.setState( { name: value } ); + break; + case 'new_fee_total': + // If value is a positive number, we can use it + if ( ! isNaN( parseFloat( value ) ) && parseFloat( value ) >= 0 ) { + this.setState( { total: value } ); + } else { + this.setState( { total: '' } ); + } + break; + } + }; + + formatCurrencyInput = () => { + const { currency } = this.props.order; + this.setState( prevState => ( { + total: getCurrencyFormatDecimal( prevState.total, currency ), + } ) ); + }; + + handleFeeSave = () => { + const { siteId, order } = this.props; + if ( siteId ) { + const { name, total } = this.state; + const feeLines = order.fee_lines || []; + const tempId = uniqueId( 'fee_' ); + this.props.editOrder( siteId, { + id: order.id, + fee_lines: [ ...feeLines, { id: tempId, name, total } ], + } ); + } + this.props.closeDialog(); + }; + + hasValidValues = () => { + const { currency } = this.props.order; + + const hasName = !! trim( this.state.name ); + const hasValue = getCurrencyFormatDecimal( this.state.total, currency ) > 0; + return hasName && hasValue; + }; + + render() { + const { closeDialog, isVisible, order, translate } = this.props; + const dialogClass = 'woocommerce order-details__dialog'; // eslint/css specificity hack + + const canSave = this.hasValidValues(); + + const dialogButtons = [ + , + , + ]; + + return ( + +

    { translate( 'Add a fee' ) }

    + { translate( 'Name' ) } + + { translate( 'Value' ) } + +
    + ); + } +} + +export default connect( + state => { + const site = getSelectedSiteWithFallback( state ); + const siteId = site ? site.ID : false; + const order = getOrderWithEdits( state ); + + return { + siteId, + order, + }; + }, + dispatch => bindActionCreators( { editOrder }, dispatch ) +)( localize( OrderFeeDialog ) ); diff --git a/client/extensions/woocommerce/app/order/order-details/style.scss b/client/extensions/woocommerce/app/order/order-details/style.scss index c4fa52b290d09..601d1659df6e4 100644 --- a/client/extensions/woocommerce/app/order/order-details/style.scss +++ b/client/extensions/woocommerce/app/order/order-details/style.scss @@ -45,6 +45,28 @@ text-align: right; } +.order-details__actions { + margin: 0 -24px; + padding: 8px 78px 8px 24px; + border-bottom: 1px solid lighten($gray, 30%); + text-align: right; + + .button + .button { + margin-left: 24px; + } + + .button { + color: $blue-medium; + + &:hover, + &:focus, + &:active { + color: $link-highlight; + } + } +} + + // Duplicating `.table` for increased specificity .order-details__totals.table.table { margin: 16px -24px; diff --git a/client/extensions/woocommerce/app/order/order-details/table.js b/client/extensions/woocommerce/app/order/order-details/table.js index 77cb48474a8c3..ebb01b74de264 100644 --- a/client/extensions/woocommerce/app/order/order-details/table.js +++ b/client/extensions/woocommerce/app/order/order-details/table.js @@ -29,6 +29,7 @@ import { getOrderRefundTotal, getOrderTotal, } from 'woocommerce/lib/order-values/totals'; +import OrderAddItems from './add-items'; import OrderTotalRow from './row-total'; import ScreenReaderText from 'components/screen-reader-text'; import Table from 'woocommerce/components/table'; @@ -270,6 +271,7 @@ class OrderDetailsTable extends Component { { order.line_items.map( this.renderOrderItem ) } { order.fee_lines.map( this.renderOrderFee ) } + { isEditing && } { const { site } = this.props; if ( trim( this.state.query ) !== '' ) { - this.props.fetchProductSearchResults( site.ID, page ); + this.props.fetchProducts( site.ID, { page, search: this.state.query } ); } else { this.props.fetchProducts( site.ID, { page } ); } @@ -80,12 +74,11 @@ class Products extends Component { if ( trim( query ) === '' ) { this.setState( { query: '' } ); - this.props.clearProductSearch( site.ID ); return; } this.setState( { query } ); - this.props.fetchProductSearchResults( site.ID, 1, query ); + this.props.fetchProducts( site.ID, { search: query } ); }; render() { @@ -140,9 +133,10 @@ class Products extends Component { function mapStateToProps( state ) { const site = getSelectedSiteWithFallback( state ); - const productsLoaded = site && areProductsLoaded( state, { page: 1, per_page: 10 }, site.ID ); - const totalProducts = site && getTotalProducts( state, site.ID ); - const productsLoading = site && areProductsLoading( state, { page: 1, per_page: 10 }, site.ID ); + const defaultParams = {}; + const productsLoaded = site && areProductsLoaded( state, defaultParams, site.ID ); + const totalProducts = site && getTotalProducts( state, defaultParams, site.ID ); + const productsLoading = site && areProductsLoading( state, defaultParams, site.ID ); return { site, productsLoaded, @@ -152,14 +146,7 @@ function mapStateToProps( state ) { } function mapDispatchToProps( dispatch ) { - return bindActionCreators( - { - fetchProducts, - fetchProductSearchResults, - clearProductSearch, - }, - dispatch - ); + return bindActionCreators( { fetchProducts }, dispatch ); } export default connect( mapStateToProps, mapDispatchToProps )( localize( Products ) ); diff --git a/client/extensions/woocommerce/app/products/product-form.scss b/client/extensions/woocommerce/app/products/product-form.scss index a50ea0515527d..7ed4495756782 100644 --- a/client/extensions/woocommerce/app/products/product-form.scss +++ b/client/extensions/woocommerce/app/products/product-form.scss @@ -447,6 +447,10 @@ min-width: 80px; } +.products__product-form-variation-table-wrapper .form-text-input-with-affixes .form-currency-input { + min-width: 100px; +} + .products__product-form-variation-table-wrapper { .form-dimensions-input__length, .form-dimensions-input__width, diff --git a/client/extensions/woocommerce/app/products/products-list-pagination.js b/client/extensions/woocommerce/app/products/products-list-pagination.js index f9e2a816ff8b3..8458fb8d14655 100644 --- a/client/extensions/woocommerce/app/products/products-list-pagination.js +++ b/client/extensions/woocommerce/app/products/products-list-pagination.js @@ -11,6 +11,7 @@ import PropTypes from 'prop-types'; * Internal dependencies */ import Pagination from 'components/pagination'; +import { DEFAULT_QUERY } from 'woocommerce/state/sites/products/utils'; const ProductsListPagination = ( { site, @@ -20,9 +21,7 @@ const ProductsListPagination = ( { requestedPage, onSwitchPage, } ) => { - const perPage = 10; - - if ( totalProducts && totalProducts < perPage + 1 ) { + if ( totalProducts && totalProducts < DEFAULT_QUERY.per_page + 1 ) { return null; } @@ -34,7 +33,7 @@ const ProductsListPagination = ( { return ( diff --git a/client/extensions/woocommerce/app/products/products-list-search-results.js b/client/extensions/woocommerce/app/products/products-list-search-results.js index 27d092da3a51c..8167a6c269fbc 100644 --- a/client/extensions/woocommerce/app/products/products-list-search-results.js +++ b/client/extensions/woocommerce/app/products/products-list-search-results.js @@ -14,15 +14,16 @@ import { localize } from 'i18n-calypso'; */ import { getSelectedSiteWithFallback } from 'woocommerce/state/sites/selectors'; import { - getTotalProductSearchResults, - areProductSearchResultsLoaded, - getProductSearchQuery, + getTotalProducts, + areProductsLoaded, + getProducts, } from 'woocommerce/state/sites/products/selectors'; import { - getProductSearchCurrentPage, - getProductSearchResults, - getProductSearchRequestedPage, + getProductsCurrentPage, + getProductsCurrentSearch, + getProductsRequestedPage, } from 'woocommerce/state/ui/products/selectors'; + import ProductsListPagination from './products-list-pagination'; import ProductsListTable from './products-list-table'; @@ -82,27 +83,16 @@ ProductsListSearchResults.propTypes = { function mapStateToProps( state ) { const site = getSelectedSiteWithFallback( state ); - const query = site && getProductSearchQuery( state, site.ID ); - const currentPage = site && getProductSearchCurrentPage( state, site.ID ); + const search = site && getProductsCurrentSearch( state, site.ID ); + const currentPage = site && getProductsCurrentPage( state, site.ID ); + const currentQuery = { page: currentPage, search }; const currentPageLoaded = - site && - currentPage && - areProductSearchResultsLoaded( - state, - { page: currentPage, per_page: 10, search: query }, - site.ID - ); - const requestedPage = site && getProductSearchRequestedPage( state, site.ID ); + site && currentPage && areProductsLoaded( state, currentQuery, site.ID ); + const requestedPage = site && getProductsRequestedPage( state, site.ID ); const requestedPageLoaded = - site && - requestedPage && - areProductSearchResultsLoaded( - state, - { page: requestedPage, per_page: 10, search: query }, - site.ID - ); - const totalProducts = site && getTotalProductSearchResults( state, site.ID ); - const products = site && getProductSearchResults( state, site.ID ); + site && requestedPage && areProductsLoaded( state, { page: requestedPage, search }, site.ID ); + const totalProducts = site && getTotalProducts( state, currentQuery, site.ID ); + const products = site && getProducts( state, currentQuery, site.ID ); return { site, @@ -112,7 +102,7 @@ function mapStateToProps( state ) { requestedPageLoaded, products, totalProducts, - query, + query: search, }; } diff --git a/client/extensions/woocommerce/app/products/products-list-table.js b/client/extensions/woocommerce/app/products/products-list-table.js index 8324050a97703..28e66cd420265 100644 --- a/client/extensions/woocommerce/app/products/products-list-table.js +++ b/client/extensions/woocommerce/app/products/products-list-table.js @@ -19,7 +19,10 @@ import TableItem from 'woocommerce/components/table/table-item'; const ProductsListTable = ( { translate, products, site, isRequesting } ) => { const headings = ( - + { [ translate( 'Product' ), translate( 'Inventory' ), @@ -39,12 +42,12 @@ const ProductsListTable = ( { translate, products, site, isRequesting } ) => { className={ classNames( { 'is-requesting': isRequesting } ) } horizontalScroll > - { products && + { !! products.length && products.map( ( product, i ) => ( ) ) }
    - { ! products &&
    } + { ! products.length &&
    }
    ); }; diff --git a/client/extensions/woocommerce/app/products/products-list.js b/client/extensions/woocommerce/app/products/products-list.js index d1cc5ddee7a44..2f4a5329ee540 100644 --- a/client/extensions/woocommerce/app/products/products-list.js +++ b/client/extensions/woocommerce/app/products/products-list.js @@ -16,11 +16,14 @@ import Button from 'components/button'; import EmptyContent from 'components/empty-content'; import { getLink } from 'woocommerce/lib/nav-utils'; import { getSelectedSiteWithFallback } from 'woocommerce/state/sites/selectors'; -import { getTotalProducts, areProductsLoaded } from 'woocommerce/state/sites/products/selectors'; import { - getProductListCurrentPage, - getProductListProducts, - getProductListRequestedPage, + getTotalProducts, + areProductsLoaded, + getProducts, +} from 'woocommerce/state/sites/products/selectors'; +import { + getProductsCurrentPage, + getProductsRequestedPage, } from 'woocommerce/state/ui/products/selectors'; import ProductsListPagination from './products-list-pagination'; import ProductsListTable from './products-list-table'; @@ -83,16 +86,15 @@ ProductsList.propTypes = { function mapStateToProps( state ) { const site = getSelectedSiteWithFallback( state ); - const currentPage = site && getProductListCurrentPage( state, site.ID ); + const currentPage = site && getProductsCurrentPage( state, site.ID ); + const currentQuery = { page: currentPage }; const currentPageLoaded = - site && currentPage && areProductsLoaded( state, { page: currentPage, per_page: 10 }, site.ID ); - const requestedPage = site && getProductListRequestedPage( state, site.ID ); + site && currentPage && areProductsLoaded( state, currentQuery, site.ID ); + const requestedPage = site && getProductsRequestedPage( state, site.ID ); const requestedPageLoaded = - site && - requestedPage && - areProductsLoaded( state, { page: requestedPage, per_page: 10 }, site.ID ); - const products = site && getProductListProducts( state, site.ID ); - const totalProducts = site && getTotalProducts( state, site.ID ); + site && requestedPage && areProductsLoaded( state, { page: requestedPage }, site.ID ); + const products = site && getProducts( state, currentQuery, site.ID ); + const totalProducts = site && getTotalProducts( state, currentQuery, site.ID ); return { site, diff --git a/client/extensions/woocommerce/app/promotions/README.md b/client/extensions/woocommerce/app/promotions/README.md index 164997f497d9c..44b20131f329e 100644 --- a/client/extensions/woocommerce/app/promotions/README.md +++ b/client/extensions/woocommerce/app/promotions/README.md @@ -16,12 +16,22 @@ by promotion type. For each promotion type, a model is returned in the following format: -**Note: this will be expanded to include different kinds of fields, like constraints.** - ```js { - field1: , - field2: , + cardModel1: { + labelText: translate( 'Card 1' ), + fields: { + fieldModel1: , + fieldModel2: , + }, + }, + cardModel2: { + labelText: translate( 'Card 2' ), + fields: { + fieldModel3: , + fieldModel4: , + }, + }, } ``` @@ -36,6 +46,8 @@ For each field in a promotion model, there is a model in the following format: explanationText: string (optional), placeholderText: string (optional), isRequired: boolean (optional), + isEnableable: boolean (optional), + defaultValue: any (optional), } ``` diff --git a/client/extensions/woocommerce/app/promotions/fields/README.md b/client/extensions/woocommerce/app/promotions/fields/README.md index 5e301dcc88f6a..45690f1a7496a 100644 --- a/client/extensions/woocommerce/app/promotions/fields/README.md +++ b/client/extensions/woocommerce/app/promotions/fields/README.md @@ -33,6 +33,10 @@ Translated text to be shown below the field children. If true, show a "Required" annotation next to the label. +### `isEnableable` (optional) + +If true, show a checkbox next to the label that will enable and disable this field. + ### `fieldName` (required) The name of the promotion field. @@ -41,6 +45,10 @@ The name of the promotion field. The placeholder text to display within the input before anything is entered. +### `defaultValue` (optional) + +The default value to be used upon initialization or when enabled if `isEnableable`. + ### `value` (optional) The current value to be rendered within the field. diff --git a/client/extensions/woocommerce/app/promotions/fields/currency-field.js b/client/extensions/woocommerce/app/promotions/fields/currency-field.js index f4ad45f770b71..880d8780f1188 100644 --- a/client/extensions/woocommerce/app/promotions/fields/currency-field.js +++ b/client/extensions/woocommerce/app/promotions/fields/currency-field.js @@ -7,44 +7,23 @@ import PropTypes from 'prop-types'; /** * Internal dependencies */ -import { getCurrencyFormatDecimal } from 'woocommerce/lib/currency'; import PriceInput from 'woocommerce/components/price-input'; import FormField from './form-field'; -const CurrencyField = ( { - fieldName, - labelText, - explanationText, - placeholderText, - isRequired, - value, - edit, - currency, -} ) => { - const renderedValue = ( 'undefined' !== typeof value ? value : '' ); +const CurrencyField = ( props ) => { + const { fieldName, explanationText, placeholderText, value, edit, currency } = props; + const renderedValue = ( 'undefined' !== typeof value && null !== value ? value : '' ); const onChange = ( e ) => { const newValue = e.target.value; - if ( 0 === newValue.length ) { - edit( fieldName, '' ); - return; - } - - const numberValue = Number( newValue ); - if ( 0 <= Number( newValue ) ) { - const formattedValue = getCurrencyFormatDecimal( numberValue, currency ); - edit( fieldName, formattedValue ); - } + edit( fieldName, String( newValue ) ); }; return ( - + { + const { fieldName, explanationText, value, edit, moment } = props; + const selectedDay = ( value ? new Date( value ) : new Date() ); + + const onSelectDay = ( day ) => { + edit( fieldName, moment( day ).format( 'YYYY-MM-DDTHH:mm:ss' ) ); + }; + + return ( + + + + ); +}; + +DateField.PropTypes = { + fieldName: PropTypes.string.isRequired, + explanationText: PropTypes.string, + value: PropTypes.number, + edit: PropTypes.func.isRequired, +}; + +export default localize( DateField ); + diff --git a/client/extensions/woocommerce/app/promotions/fields/form-field.js b/client/extensions/woocommerce/app/promotions/fields/form-field.js index f2df0f7af73b3..288998eaa4ad0 100644 --- a/client/extensions/woocommerce/app/promotions/fields/form-field.js +++ b/client/extensions/woocommerce/app/promotions/fields/form-field.js @@ -3,10 +3,12 @@ */ import React from 'react'; import PropTypes from 'prop-types'; +import classNames from 'classnames'; /** * Internal dependencies */ +import FormCheckbox from 'components/forms/form-checkbox'; import FormFieldset from 'components/forms/form-fieldset'; import FormLabel from 'components/forms/form-label'; import FormSettingExplanation from 'components/forms/form-setting-explanation'; @@ -16,30 +18,65 @@ const FormField = ( { labelText, explanationText, isRequired, + isEnableable, + defaultValue, children, + value, + edit, } ) => { + const isValueValid = ! ( 'undefined' === typeof value ); + const showChildren = ( isEnableable ? isValueValid : true ); + const explanation = ( explanationText && { explanationText } ); + let enableCheckbox = null; + + if ( isEnableable ) { + const enableCheckboxChanged = + () => edit( fieldName, ( isValueValid ? undefined : ( defaultValue || null ) ) ); + + enableCheckbox = ( + + ); + } + + const childrenClassNames = classNames( + 'fields__fieldset-children', + { 'fields__fieldset-children-enableable': enableCheckbox } + ); + + const formLabel = ( enableCheckbox || labelText ) && ( + + { enableCheckbox } + { labelText } + + ); + return ( - - - { labelText } - - { children } - { explanation } + + { formLabel } +
    + { showChildren && children } + { explanation } +
    ); }; FormField.PropTypes = { fieldName: PropTypes.string.isRequired, - labelText: PropTypes.string.isRequired, + labelText: PropTypes.string, explanationText: PropTypes.string, isRequired: PropTypes.bool, + isEnableable: PropTypes.bool, + defaultValue: PropTypes.any, children: PropTypes.isRequired, }; diff --git a/client/extensions/woocommerce/app/promotions/fields/index.js b/client/extensions/woocommerce/app/promotions/fields/index.js new file mode 100644 index 0000000000000..99de29609ac6d --- /dev/null +++ b/client/extensions/woocommerce/app/promotions/fields/index.js @@ -0,0 +1,33 @@ +/** + * External dependencies + */ +import React from 'react'; +import warn from 'lib/warn'; + +export function renderComponent( component, props ) { + switch ( typeof component ) { + case 'undefined': + return null; + case 'function': + return React.createElement( component, props ); + case 'object': + return React.cloneElement( component, props ); + default: + warn( 'Unrecognized component type: ' + ( typeof component ) ); + return null; + } +} + +export function renderField( fieldName, fieldModel, promotion, edit, currency ) { + const { component, ...props } = fieldModel; + + return renderComponent( component, { + ...props, + key: fieldName, + value: promotion[ fieldName ], + fieldName, + edit, + currency, + } ); +} + diff --git a/client/extensions/woocommerce/app/promotions/fields/number-field.js b/client/extensions/woocommerce/app/promotions/fields/number-field.js new file mode 100644 index 0000000000000..f088bbc50db98 --- /dev/null +++ b/client/extensions/woocommerce/app/promotions/fields/number-field.js @@ -0,0 +1,57 @@ +/** + * External dependencies + */ +import React from 'react'; +import PropTypes from 'prop-types'; + +/** + * Internal dependencies + */ +import FormTextInput from 'components/forms/form-text-input'; +import FormField from './form-field'; + +const NumberField = ( props ) => { + const { fieldName, explanationText, placeholderText, value, edit, minValue, maxValue } = props; + const renderedValue = ( 'undefined' !== typeof value && null !== value ? value : '' ); + + const onChange = ( e ) => { + const newValue = e.target.value; + + if ( 'undefined' !== minValue && newValue < minValue ) { + return; + } + if ( 'undefined' !== maxValue && newValue > maxValue ) { + return; + } + + edit( fieldName, String( newValue ) ); + }; + + return ( + + + + ); +}; + +NumberField.PropTypes = { + fieldName: PropTypes.string.isRequired, + explanationText: PropTypes.string, + placeholderText: PropTypes.string, + value: PropTypes.number, + minValue: PropTypes.number, + maxValue: PropTypes.number, + edit: PropTypes.func.isRequired, +}; + +export default NumberField; + diff --git a/client/extensions/woocommerce/app/promotions/fields/percent-field.js b/client/extensions/woocommerce/app/promotions/fields/percent-field.js index f87933c366b9e..eacdc62c86de0 100644 --- a/client/extensions/woocommerce/app/promotions/fields/percent-field.js +++ b/client/extensions/woocommerce/app/promotions/fields/percent-field.js @@ -10,15 +10,8 @@ import PropTypes from 'prop-types'; import FormTextInputWithAffixes from 'components/forms/form-text-input-with-affixes'; import FormField from './form-field'; -const PercentField = ( { - fieldName, - labelText, - explanationText, - placeholderText, - isRequired, - value, - edit, -} ) => { +const PercentField = ( props ) => { + const { fieldName, explanationText, placeholderText, value, edit } = props; const renderedValue = ( 'undefined' !== typeof value ? value : '' ); const onChange = ( e ) => { @@ -29,12 +22,7 @@ const PercentField = ( { }; return ( - + id !== categoryId ); + return { ...appliesTo, productCategoryIds: newCategoryIds }; +} + +function addProductId( appliesTo, productId ) { + const productIds = ( appliesTo ? appliesTo.productIds : [] ); + const newProductIds = [ ...productIds, productId ]; + return { ...appliesTo, productIds: newProductIds }; +} + +function removeProductId( appliesTo, productId ) { + const productIds = ( appliesTo ? appliesTo.productIds : [] ); + const newProductIds = productIds.filter( ( id ) => id !== productId ); + return { ...appliesTo, productIds: newProductIds }; +} + +function renderImage( imageSrc ) { + const imageClasses = classNames( 'promotion-applies-to-field__list-image', { + 'is-thumb-placeholder': ! imageSrc, + } ); + + return ( + + { imageSrc && } + + ); +} + +function renderRow( component, rowText, rowValue, imageSrc, selected, onChange ) { + const labelId = `applies-to-row-${ rowValue }-label`; + + const rowComponent = React.createElement( component, { + htmlFor: labelId, + name: 'applies_to_select', + value: rowValue, + checked: selected, + onChange: onChange, + } ); + + return ( +
    + + { rowComponent } + { renderImage( imageSrc ) } + { rowText } + +
    + ); +} + +class AppliesToFilteredList extends React.Component { + static propTypes = { + appliesToType: PropTypes.string, + singular: PropTypes.bool, + value: PropTypes.object, + edit: PropTypes.func.isRequired, + products: PropTypes.array, + productCategories: PropTypes.array, + currency: PropTypes.string, + }; + + constructor( props ) { + super( props ); + this.state = { + searchFilter: '', + }; + } + + getFilteredCategories() { + const { value, productCategories } = this.props; + const { searchFilter } = this.state; + + if ( 0 === searchFilter.length ) { + return productCategories; + } + + return productCategories && productCategories.filter( + ( category ) => { + return categoryContainsString( category, searchFilter ) || + isCategorySelected( value, category.id ); + } + ); + } + + getFilteredProducts() { + const { value, products } = this.props; + const { searchFilter } = this.state; + + if ( 0 === searchFilter.length ) { + return products; + } + + return products && products.filter( + ( product ) => { + return productContainsString( product, searchFilter ) || + isProductSelected( value, product.id ); + } + ); + } + + renderSearch( appliesToType, searchFilter ) { + if ( 'all' === appliesToType ) { + return null; + } + + return ( + + ); + } + + renderList( appliesToType, singular ) { + switch ( appliesToType ) { + case 'all': + return null; + case 'productIds': + return this.renderProductList( singular ); + case 'productCategoryIds': + return this.renderCategoryList(); + case null: + // TODO: Add placeholder? + return null; + default: + warn( 'Unrecognized appliesToType: ', appliesToType ); + return null; + } + } + + renderCategoryList() { + const filteredCategories = this.getFilteredCategories() || []; + + return ( +
    + { filteredCategories.map( this.renderCategoryCheckbox ) } +
    + ); + } + + renderProductList( singular, currency ) { + const filteredProducts = this.getFilteredProducts() || []; + const renderFunc = ( singular + ? this.renderProductRadio( currency ) + : this.renderProductCheckbox( currency ) + ); + + return ( +
    + { filteredProducts.map( renderFunc ) } +
    + ); + } + + renderCategoryCheckbox = ( category ) => { + const { value } = this.props; + const { name, id, image } = category; + const selected = isCategorySelected( value, id ); + const imageSrc = image && image.src; + + return renderRow( FormCheckbox, name, id, imageSrc, selected, this.onCategoryCheckbox ); + } + + renderProductCheckbox = ( currency ) => ( product ) => { + const { value } = this.props; + const { name, regular_price, id, images } = product; + const nameWithPrice = name + ' - ' + formatCurrency( regular_price, currency ); + const selected = isProductSelected( value, id ); + const image = images && images[ 0 ]; + const imageSrc = image && image.src; + + return renderRow( FormCheckbox, nameWithPrice, id, imageSrc, selected, this.onProductCheckbox ); + } + + renderProductRadio = ( currency ) => ( product ) => { + const { value } = this.props; + const { name, regular_price, id, images } = product; + const nameWithPrice = name + ' - ' + formatCurrency( regular_price, currency ); + const selected = isProductSelected( value, product.id ); + const image = images && images[ 0 ]; + const imageSrc = image && image.src; + + return renderRow( FormRadio, nameWithPrice, id, imageSrc, selected, this.onProductRadio ); + } + + onSearch = ( searchFilter ) => { + this.setState( () => ( { searchFilter } ) ); + } + + onCategoryCheckbox = ( e ) => { + const { value, edit } = this.props; + const categoryId = Number( e.target.value ); + const selected = isCategorySelected( value, categoryId ); + const newValue = ( selected + ? removeCategoryId( value, categoryId ) + : addCategoryId( value, categoryId ) + ); + edit( 'appliesTo', newValue ); + } + + onProductCheckbox = ( e ) => { + const { value, edit } = this.props; + const productId = Number( e.target.value ); + const selected = isProductSelected( value, productId ); + const newValue = ( selected + ? removeProductId( value, productId ) + : addProductId( value, productId ) + ); + edit( 'appliesTo', newValue ); + } + + onProductRadio = ( e ) => { + const { edit } = this.props; + const productId = Number( e.target.value ); + edit( 'appliesTo', { productIds: [ productId ] } ); + } + + render() { + const { appliesToType, singular } = this.props; + const { searchFilter } = this.state; + + return ( +
    + { this.renderSearch( appliesToType, searchFilter ) } + { this.renderList( appliesToType, singular ) } +
    + ); + } +} + +function mapStateToProps( state ) { + const site = getSelectedSiteWithFallback( state ); + const siteId = ( site ? site.ID : null ); + const products = getPromotionableProducts( state, siteId ); + const productCategories = getProductCategories( state, siteId ); + + // TODO: This is temporary until we can support variable products. + const nonVariableProducts = products && products.filter( + ( product ) => 'variable' !== product.type + ); + + return { + products: nonVariableProducts, + productCategories, + }; +} + +export default connect( mapStateToProps )( AppliesToFilteredList ); + diff --git a/client/extensions/woocommerce/app/promotions/fields/promotion-applies-to-field/index.js b/client/extensions/woocommerce/app/promotions/fields/promotion-applies-to-field/index.js new file mode 100644 index 0000000000000..b064c9014f019 --- /dev/null +++ b/client/extensions/woocommerce/app/promotions/fields/promotion-applies-to-field/index.js @@ -0,0 +1,130 @@ +/** + * External dependencies + */ +import React from 'react'; +import PropTypes from 'prop-types'; +import { localize } from 'i18n-calypso'; + +/** + * Internal dependencies + */ +import FormField from '../form-field'; +import FormSelect from 'components/forms/form-select'; +import AppliesToFilteredList from './applies-to-filtered-list'; + +class PromotionAppliesToField extends React.Component { + static propTypes = { + selectionTypes: PropTypes.array.isRequired, + value: PropTypes.object, + edit: PropTypes.func.isRequired, + singular: PropTypes.bool, + }; + + constructor( props ) { + super( props ); + this.state = { + appliesToType: null, + }; + } + + componentWillMount() { + const { selectionTypes, value } = this.props; + const initialType = this.getInitialType( selectionTypes, value ); + + this.setState( () => ( { appliesToType: initialType } ) ); + } + + componentWillReceiveProps( nextProps ) { + const { selectionTypes, value } = nextProps; + const initialType = this.getInitialType( selectionTypes, value ); + + this.setState( () => ( { appliesToType: initialType } ) ); + } + + getInitialType( selectionTypes, value ) { + for ( const selectionType of selectionTypes ) { + if ( value && value[ selectionType.type ] ) { + return selectionType.type; + } + } + + // No match for a type already in the value, so go with the first. + return selectionTypes[ 0 ].type; + } + + getInitialValue( appliesToType, singular, value ) { + if ( 'all' === appliesToType ) { + return true; + } + + const ids = ( value && value[ appliesToType ] ) || []; + + if ( singular ) { + return ids.slice( 0, 1 ); + } + + return ids; + } + + initializeValue( appliesToType ) { + const { value, edit, singular } = this.props; + + const initialValue = this.getInitialValue( appliesToType, singular, value ); + edit( 'appliesTo', { [ appliesToType ]: initialValue } ); + } + + renderTypeSelect = () => { + const { selectionTypes } = this.props; + const { appliesToType } = this.state; + + if ( selectionTypes.length === 1 ) { + return null; + } + + return ( + + { selectionTypes.map( this.renderTypeSelectOption ) } + + ); + }; + + renderTypeSelectOption = ( option ) => { + return ( + + ); + }; + + onTypeChange = ( e ) => { + const appliesToType = e.target.value; + this.setState( () => ( { appliesToType } ) ); + this.initializeValue( appliesToType ); + }; + + render() { + const { + value, + edit, + singular, + } = this.props; + const { appliesToType } = this.state; + + return ( +
    + + { this.renderTypeSelect() } + + +
    + ); + } +} + +export default localize( PromotionAppliesToField ); + diff --git a/client/extensions/woocommerce/app/promotions/fields/style.scss b/client/extensions/woocommerce/app/promotions/fields/style.scss new file mode 100644 index 0000000000000..0e8e6033dbcbd --- /dev/null +++ b/client/extensions/woocommerce/app/promotions/fields/style.scss @@ -0,0 +1,139 @@ +.fields__fieldset { + .form-label { + input[type=checkbox] { + margin-right: 8px; + } + } +} + +.fields__fieldset { + .fields__fieldset-children-enableable { + margin-top: 8px; + + &:empty { + margin: 0; + } + } + + .date-picker { + max-width: 280px; + border: 1px solid lighten( $gray, 30% ); + padding: 16px; + + .DayPicker-NavBar { + margin-left: 16px; + margin-right: 16px; + } + } +} + +.promotions__promotion-form-card-conditions { + padding-top: 16px; + padding-bottom: 16px; + + .form-label { + font-weight: 400; + margin-bottom: 0; + } + + .form-fieldset { + border-bottom: 1px solid lighten( $gray, 32% ); + padding-bottom: 16px; + margin-bottom: 16px; + margin-left: -16px; + margin-right: -16px; + padding-left: 16px; + padding-right: 16px; + + @include breakpoint( ">480px" ) { + margin-left: -24px; + margin-right: -24px; + padding-left: 24px; + padding-right: 24px; + } + + &:last-child { + margin-bottom: 0; + padding-bottom: 0; + border-bottom: 0; + } + } +} + +.promotion-applies-to-field { + .search { + margin-bottom: 0; + border: 1px solid lighten( $gray, 20% ); + z-index: 0; // Keeps search from overlapping header above. + box-sizing: border-box; + z-index: 9; + } + + .form-fieldset { + margin-bottom: 0; + } + + select + .promotion-applies-to-field__filtered-list { + margin-top: 16px; + + &:empty { + margin-top: 0; + } + } + + .promotion-applies-to-field__list { + position: relative; + border: 1px solid lighten( $gray, 20% ); + border-top: 0; + overflow-y: auto; + max-height: 250px; + + .promotion-applies-to-field__row { + background-color: $white; + cursor: pointer; + border-bottom: 1px solid $gray-light; + + &:hover { + background: lighten( $gray-light, 2% ); + } + + &:last-child { + border-bottom: 0; + } + + label { + width: 100%; + display: flex; + align-items: center; + padding: 12px 16px; + margin: 0; + font-weight: 400; + cursor: pointer; + } + + .promotion-applies-to-field__list-image { + display: inline-block; + height: 32px; + width: 32px; + overflow: hidden; + position: relative; + margin: 0 12px; + + &.is-thumb-placeholder { + background: $gray-light; + } + + img { + position: absolute; + left: 50%; + top: 50%; + height: 100%; + width: auto; + -webkit-transform: translate( -50%, -50% ); + transform: translate( -50%, -50% ); + } + } + + } + } +} diff --git a/client/extensions/woocommerce/app/promotions/fields/text-field.js b/client/extensions/woocommerce/app/promotions/fields/text-field.js index 2cfbf083ceac8..e95e4ddeefa5a 100644 --- a/client/extensions/woocommerce/app/promotions/fields/text-field.js +++ b/client/extensions/woocommerce/app/promotions/fields/text-field.js @@ -10,15 +10,8 @@ import PropTypes from 'prop-types'; import FormTextInput from 'components/forms/form-text-input'; import FormField from './form-field'; -const TextField = ( { - fieldName, - labelText, - explanationText, - placeholderText, - isRequired, - value, - edit, -} ) => { +const TextField = ( props ) => { + const { fieldName, explanationText, placeholderText, value, edit } = props; const renderedValue = ( 'undefined' !== typeof value ? value : '' ); const onChange = ( e ) => { @@ -27,12 +20,7 @@ const TextField = ( { }; return ( - + 0; + + switch ( promotion.type ) { + case 'product_sale': + const { productIds } = promotion.appliesTo || {}; + const validProductTarget = ( productIds && productIds.length === 1 ); + const validSalePrice = promotion.salePrice && promotion.salePrice.length > 0; + return validProductTarget && validSalePrice; + case 'percent': + const validPercent = promotion.percentDiscount && promotion.percentDiscount > 0; + return validCouponCode && validPercent; + case 'fixed_cart': + case 'fixed_product': + const validFixedDiscount = promotion.fixedDiscount && promotion.fixedDiscount > 0; + return validCouponCode && validFixedDiscount; + default: + return false; + } +} + diff --git a/client/extensions/woocommerce/app/promotions/index.js b/client/extensions/woocommerce/app/promotions/index.js index c8d7cf614e7e1..9fe15741a0c55 100644 --- a/client/extensions/woocommerce/app/promotions/index.js +++ b/client/extensions/woocommerce/app/promotions/index.js @@ -10,11 +10,11 @@ import PropTypes from 'prop-types'; import classNames from 'classnames'; import { connect } from 'react-redux'; import { localize } from 'i18n-calypso'; -import { noop } from 'lodash'; /** * Internal dependencies */ +import EmptyContent from 'components/empty-content'; import { fetchPromotions } from 'woocommerce/state/sites/promotions/actions'; import { getPromotions } from 'woocommerce/state/selectors/promotions'; import ActionHeader from 'woocommerce/components/action-header'; @@ -35,6 +35,14 @@ class Promotions extends Component { fetchPromotions: PropTypes.func.isRequired, }; + constructor( props ) { + super( props ); + + this.state = { + searchFilter: '', + }; + } + componentDidMount() { const { site } = this.props; if ( site && site.ID ) { @@ -52,13 +60,16 @@ class Promotions extends Component { } } + onSearch = searchFilter => { + this.setState( () => ( { searchFilter } ) ); + }; + renderSearchCard() { const { site, promotions, translate } = this.props; - // TODO: Implement onSearch return ( + { translate( 'Add a promotion!' ) } + + ); + + return ( + + ); + } + + renderContent() { + const { searchFilter } = this.state; + + return ( +
    + { this.renderSearchCard() } + +
    + ); + } + render() { - const { site, className, translate } = this.props; + const { site, className, promotions, translate } = this.props; const classes = classNames( 'promotions__list', className ); + const isEmpty = site && promotions && 0 === promotions.length; + + const content = isEmpty ? this.renderEmptyContent() : this.renderContent(); return (
    @@ -79,8 +121,7 @@ class Promotions extends Component { { translate( 'Add promotion' ) } - { this.renderSearchCard() } - + { content }
    ); } diff --git a/client/extensions/woocommerce/app/promotions/promotion-create.js b/client/extensions/woocommerce/app/promotions/promotion-create.js index 0b10d16c65fe8..7a169757708c7 100644 --- a/client/extensions/woocommerce/app/promotions/promotion-create.js +++ b/client/extensions/woocommerce/app/promotions/promotion-create.js @@ -9,25 +9,37 @@ import PropTypes from 'prop-types'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import { localize } from 'i18n-calypso'; +import page from 'page'; /** * Internal dependencies */ import Main from 'components/main'; import { editPromotion, clearPromotionEdits } from 'woocommerce/state/ui/promotions/actions'; +import { getLink } from 'woocommerce/lib/nav-utils'; import { getSelectedSiteWithFallback } from 'woocommerce/state/sites/selectors'; +import { fetchProductCategories } from 'woocommerce/state/sites/product-categories/actions'; +import { fetchPromotions, createPromotion } from 'woocommerce/state/sites/promotions/actions'; import { fetchSettingsGeneral } from 'woocommerce/state/sites/settings/general/actions'; import { getPaymentCurrencySettings } from 'woocommerce/state/sites/settings/general/selectors'; +import { getProductCategories } from 'woocommerce/state/sites/product-categories/selectors'; import { getCurrentlyEditingPromotionId, + getPromotionEdits, + getPromotionableProducts, getPromotionWithLocalEdits, } from 'woocommerce/state/selectors/promotions'; +import { isValidPromotion } from './helpers'; import PromotionHeader from './promotion-header'; import PromotionForm from './promotion-form'; +import { ProtectFormGuard } from 'lib/protect-form'; +import { successNotice, errorNotice } from 'state/notices/actions'; class PromotionCreate extends React.Component { static propTypes = { className: PropTypes.string, + currency: PropTypes.string, + hasEdits: PropTypes.bool.isRequired, site: PropTypes.shape( { ID: PropTypes.number, slug: PropTypes.string, @@ -37,12 +49,26 @@ class PromotionCreate extends React.Component { } ), editPromotion: PropTypes.func.isRequired, clearPromotionEdits: PropTypes.func.isRequired, + createPromotion: PropTypes.func.isRequired, + fetchProductCategories: PropTypes.func.isRequired, + fetchPromotions: PropTypes.func.isRequired, + fetchSettingsGeneral: PropTypes.func.isRequired, }; + constructor( props ) { + super( props ); + + this.state = { + busy: false, + }; + } + componentDidMount() { const { site } = this.props; if ( site && site.ID ) { + this.props.fetchProductCategories( site.ID ); + this.props.fetchPromotions( site.ID ); this.props.fetchSettingsGeneral( site.ID ); } } @@ -52,6 +78,8 @@ class PromotionCreate extends React.Component { const newSiteId = ( newProps.site && newProps.site.ID ) || null; const oldSiteId = ( site && site.ID ) || null; if ( oldSiteId !== newSiteId ) { + this.props.fetchProductCategories( newSiteId ); + this.props.fetchPromotions( newSiteId ); this.props.fetchSettingsGeneral( newSiteId ); } } @@ -64,23 +92,57 @@ class PromotionCreate extends React.Component { } onSave = () => { - // TODO: Add action to save promotion. - }; - - isPromotionValid() { - const { promotion } = this.props; + const { site, promotion, translate } = this.props; + + this.setState( () => ( { busy: true } ) ); + + const getSuccessNotice = () => { + return successNotice( + translate( '%(promotion)s promotion successfully created.', { + args: { promotion: promotion.name }, + } ), + { + displayOnNextPage: true, + duration: 8000, + } + ); + }; + + const successAction = dispatch => { + this.props.clearPromotionEdits( site.ID ); - // TODO: Update with real info. - return promotion && promotion.id; - } + dispatch( getSuccessNotice( promotion ) ); + page.redirect( getLink( '/store/promotions/:site', site ) ); + }; + + const failureAction = dispatch => { + dispatch( + errorNotice( + translate( 'There was a problem saving the %(promotion)s promotion. Please try again.', { + args: { promotion: promotion.name }, + } ) + ) + ); + this.setState( () => ( { busy: false } ) ); + }; + + this.props.createPromotion( site.ID, promotion, successAction, failureAction ); + }; render() { - const { site, currency, className, promotion } = this.props; - - // TODO: Update with real info. - const isValid = 'undefined' !== typeof site && this.isPromotionValid(); - const isBusy = false; - const saveEnabled = isValid && ! isBusy; + const { + site, + currency, + className, + promotion, + hasEdits, + products, + productCategories + } = this.props; + const { busy } = this.state; + + const isValid = 'undefined' !== typeof site && isValidPromotion( promotion ); + const saveEnabled = isValid && ! busy && hasEdits; return (
    @@ -88,13 +150,16 @@ class PromotionCreate extends React.Component { site={ site } promotion={ promotion } onSave={ saveEnabled ? this.onSave : false } - isBusy={ isBusy } + isBusy={ busy } /> +
    ); @@ -104,14 +169,20 @@ class PromotionCreate extends React.Component { function mapStateToProps( state ) { const site = getSelectedSiteWithFallback( state ); const currencySettings = getPaymentCurrencySettings( state ); - const currency = ( currencySettings ? currencySettings.value : null ); + const currency = currencySettings ? currencySettings.value : null; const promotionId = getCurrentlyEditingPromotionId( state, site.ID ); - const promotion = ( promotionId ? getPromotionWithLocalEdits( state, promotionId, site.ID ) : null ); + const promotion = promotionId ? getPromotionWithLocalEdits( state, promotionId, site.ID ) : null; + const hasEdits = Boolean( getPromotionEdits( state, promotionId, site.ID ) ); + const products = getPromotionableProducts( state, site.ID ); + const productCategories = getProductCategories( state, site.ID ); return { + hasEdits, site, promotion, currency, + products, + productCategories, }; } @@ -120,6 +191,9 @@ function mapDispatchToProps( dispatch ) { { editPromotion, clearPromotionEdits, + createPromotion, + fetchProductCategories, + fetchPromotions, fetchSettingsGeneral, }, dispatch diff --git a/client/extensions/woocommerce/app/promotions/promotion-form-card.js b/client/extensions/woocommerce/app/promotions/promotion-form-card.js index 99f9a0d78133b..227def9a578ec 100644 --- a/client/extensions/woocommerce/app/promotions/promotion-form-card.js +++ b/client/extensions/woocommerce/app/promotions/promotion-form-card.js @@ -3,14 +3,13 @@ */ import React from 'react'; import PropTypes from 'prop-types'; -import { localize } from 'i18n-calypso'; -import warn from 'lib/warn'; +import classNames from 'classnames'; /** * Internal dependencies */ import Card from 'components/card'; -import promotionModels from './promotion-models'; +import { renderField } from './fields'; import SectionHeader from 'components/section-header'; const promotionFieldEdit = ( siteId, promotion, editPromotion ) => ( fieldName, newValue ) => { @@ -21,66 +20,29 @@ const promotionFieldEdit = ( siteId, promotion, editPromotion ) => ( fieldName, editPromotion( siteId, promotion, newPromotion ); }; -function renderFields( promotion, edit, translate, currency ) { - const model = promotionModels[ promotion.type ]; - - if ( ! model ) { - warn( 'No model found for promotion type: ' + promotion.type ); - return null; - } - - return Object.keys( model ).map( ( fieldName ) => { - const fieldModel = model[ fieldName ]; - return renderField( fieldName, fieldModel, promotion, edit, currency ); - } ); -} - -function renderField( fieldName, fieldModel, promotion, edit, currency ) { - const { component, labelText, explanationText, placeholderText, isRequired } = fieldModel; - - return React.createElement( component, { - key: fieldName, - fieldName, - labelText, - explanationText, - placeholderText, - isRequired, - value: promotion[ fieldName ], - edit, - currency, - } ); -} - -function getHeaderText( promotionType, translate ) { - switch ( promotionType ) { - case 'product_sale': - return translate( 'Product & Sale Price' ); - case 'fixed_product': - case 'fixed_cart': - case 'percent': - return translate( 'Coupon Code & Discount' ); - } -} - const PromotionFormCard = ( { siteId, currency, promotion, + cardModel, editPromotion, - translate } ) => { const edit = promotionFieldEdit( siteId, promotion, editPromotion ); + const fields = Object.keys( cardModel.fields ).map( ( fieldName ) => { + const fieldModel = cardModel.fields[ fieldName ]; + return renderField( fieldName, fieldModel, promotion, edit, currency ); + } ); + + const classes = classNames( + 'promotions__promotion-form-card', + { [ cardModel.cssClass ]: cardModel.cssClass } + ); return (
    - - - { renderFields( - promotion, - edit, - translate, - currency - ) } + + + { fields }
    ); @@ -94,7 +56,11 @@ PromotionFormCard.PropTypes = { type: PropTypes.string.isRequired, } ), editPromotion: PropTypes.func.isRequired, + cardModel: PropTypes.shape( { + labelText: PropTypes.string.isRequired, + fields: PropTypes.object.isRequired, + } ).isRequired, }; -export default localize( PromotionFormCard ); +export default PromotionFormCard; diff --git a/client/extensions/woocommerce/app/promotions/promotion-form-type-card.js b/client/extensions/woocommerce/app/promotions/promotion-form-type-card.js index c5c1e7fa7deb0..3c84473637126 100644 --- a/client/extensions/woocommerce/app/promotions/promotion-form-type-card.js +++ b/client/extensions/woocommerce/app/promotions/promotion-form-type-card.js @@ -16,7 +16,7 @@ import FormSettingExplanation from 'components/forms/form-setting-explanation'; function getExplanation( promotionType, translate ) { switch ( promotionType ) { case 'product_sale': - return translate( 'Put a product on sale for all customers.' ); + return translate( 'Place a single product on sale for all customers.' ); case 'fixed_product': return translate( 'Issue a coupon with a discount for one or more products.' ); case 'fixed_cart': @@ -34,6 +34,9 @@ const PromotionFormTypeCard = ( { } ) => { const promotionType = ( promotion && promotion.type ? promotion.type : '' ); + const productTypesDisabled = Boolean( promotion.couponId ); + const couponTypesDisabled = Boolean( promotion.productId ); + const onTypeSelect = ( e ) => { const type = e.target.value; editPromotion( siteId, promotion, { type } ); @@ -44,10 +47,18 @@ const PromotionFormTypeCard = ( { - - - - + + + + { getExplanation( promotionType, translate ) } @@ -69,4 +80,3 @@ PromotionFormTypeCard.PropTypes = { }; export default localize( PromotionFormTypeCard ); - diff --git a/client/extensions/woocommerce/app/promotions/promotion-form.js b/client/extensions/woocommerce/app/promotions/promotion-form.js index 92ae625a52976..e6b0d18a038bb 100644 --- a/client/extensions/woocommerce/app/promotions/promotion-form.js +++ b/client/extensions/woocommerce/app/promotions/promotion-form.js @@ -4,13 +4,15 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import { uniqueId } from 'lodash'; +import { uniqueId, get, find } from 'lodash'; +import warn from 'lib/warn'; /** * Internal dependencies */ import PromotionFormCard from './promotion-form-card'; import PromotionFormTypeCard from './promotion-form-type-card'; +import promotionModels from './promotion-models'; function renderPlaceholder() { const { className } = this.props; @@ -32,28 +34,71 @@ export default class PromotionForm extends React.PureComponent { id: PropTypes.isRequired, } ), editPromotion: PropTypes.func.isRequired, + products: PropTypes.array, + productCategories: PropTypes.array, }; + calculatePromotionName = ( promotion ) => { + const { products } = this.props; + + switch ( promotion.type ) { + case 'fixed_discount': + case 'fixed_cart': + case 'percent': + return promotion.couponCode; + case 'product_sale': + const productIds = get( promotion, [ 'appliesTo', 'productIds' ], [] ); + const productId = ( productIds.length > 0 ? productIds[ 0 ] : null ); + const product = productId && find( products, { id: productId } ); + return ( product ? product.name : '' ); + } + } + + editPromotionWithNameUpdate = ( siteId, promotion, data ) => { + const name = this.calculatePromotionName( { ...promotion, ...data } ); + const adjustedData = { ...data, name }; + + return this.props.editPromotion( siteId, promotion, adjustedData ); + } + + renderFormCards( promotion ) { + const { siteId, currency } = this.props; + const model = promotionModels[ promotion.type ]; + const editPromotion = this.editPromotionWithNameUpdate; + + if ( ! model ) { + warn( 'No model found for promotion type: ' + promotion.type ); + return null; + } + + return Object.keys( model ).map( ( key ) => { + const cardModel = model[ key ]; + return ( + + ); + } ); + } + render() { - const { siteId, currency, editPromotion } = this.props; + const { siteId, editPromotion } = this.props; if ( ! siteId ) { return renderPlaceholder(); } const promotion = this.props.promotion || - { id: { placeholder: uniqueId( 'promotion_' ) }, type: 'percent' }; + { id: { placeholder: uniqueId( 'promotion_' ) }, type: 'fixed_product' }; return (
    - - + { this.renderFormCards( promotion ) }
    ); } diff --git a/client/extensions/woocommerce/app/promotions/promotion-form.scss b/client/extensions/woocommerce/app/promotions/promotion-form.scss index 10e6f4e4eee7a..b7ade9872d7cd 100644 --- a/client/extensions/woocommerce/app/promotions/promotion-form.scss +++ b/client/extensions/woocommerce/app/promotions/promotion-form.scss @@ -31,9 +31,7 @@ } } - .form-label { - display: inline-block; - margin-bottom: 5px; + .form-fieldset:last-child { + margin-bottom: 0; } } - diff --git a/client/extensions/woocommerce/app/promotions/promotion-header.js b/client/extensions/woocommerce/app/promotions/promotion-header.js index 9998ef489b834..7781ef694638e 100644 --- a/client/extensions/woocommerce/app/promotions/promotion-header.js +++ b/client/extensions/woocommerce/app/promotions/promotion-header.js @@ -24,7 +24,7 @@ function renderTrashButton( onTrash, promotion, isBusy, translate ) { } function renderSaveButton( onSave, promotion, isBusy, translate ) { - if ( 'undefined' !== typeof onSave ) { + if ( 'undefined' === typeof onSave ) { // 'Save' not allowed here. return null; } diff --git a/client/extensions/woocommerce/app/promotions/promotion-models.js b/client/extensions/woocommerce/app/promotions/promotion-models.js index 9866e560fe320..28916849bbcef 100644 --- a/client/extensions/woocommerce/app/promotions/promotion-models.js +++ b/client/extensions/woocommerce/app/promotions/promotion-models.js @@ -1,17 +1,22 @@ /** * External dependencies */ +import React from 'react'; import { translate } from 'i18n-calypso'; /** * Internal dependencies */ import CurrencyField from './fields/currency-field'; +import DateField from './fields/date-field'; +import FormField from './fields/form-field'; +import NumberField from './fields/number-field'; import PercentField from './fields/percent-field'; import TextField from './fields/text-field'; +import PromotionAppliesToField from './fields/promotion-applies-to-field'; /** - * Field reused for all coupon promotion types. + * "Coupon code" field reused for all coupon promotion types. */ const couponCodeField = { component: TextField, @@ -23,6 +28,89 @@ const couponCodeField = { isRequired: true, }; +/** + * Coupon "Applies to" card. + */ +const appliesToCoupon = { + labelText: translate( 'Applies to' ), + cssClass: 'promotions__promotion-form-card-applies-to', + fields: { + appliesTo: { + component: ( + + ), + // TODO: Remove this text after variable products are supported. + explanationText: translate( + 'Note: Variable products cannot be selected directly, ' + + 'only via Product Categories or All Products.' + ), + }, + }, +}; + +/** + * Coupon "Applies when" card. + */ +const appliesWhenCoupon = { + labelText: translate( 'Applies when' ), + cssClass: 'promotions__promotion-form-card-applies-to', + fields: { + appliesTo: { + component: ( + + ), + // TODO: Remove this text after variable products are supported. + explanationText: translate( + 'Note: Variable products cannot be selected directly, ' + + 'only via Product Categories or All Products.' + ), + }, + }, +}; + +/** + * Product sale "Applies to" card. + */ +const appliesToProductSale = { + labelText: translate( 'Applies to product' ), + cssClass: 'promotions__promotion-form-card-applies-to', + fields: { + appliesTo: { + component: ( + + ), + // TODO: Remove this text after variable products are supported. + explanationText: translate( + 'Note: Variable products cannot be selected.' + ), + }, + }, +}; + /** * Field reused for fixed currency-based coupons. */ @@ -32,14 +120,86 @@ const fixedDiscountField = { isRequired: true, }; +/** + * General purpose start date condition. + */ +const startDate = { + component: DateField, + labelText: translate( 'Start Date' ), + isEnableable: true, +}; + +/** + * General purpose end date condition. + */ +const endDate = { + component: DateField, + labelText: translate( 'End Date' ), + isEnableable: true, +}; + /** * Promotion Type: Product Sale (e.g. $5 off the "I <3 Robots" t-shirt) */ const productSaleModel = { - salePrice: { - component: CurrencyField, - labelText: translate( 'Product Sale Price' ), - isRequired: true, + appliesToProductSale, + productAndSalePrice: { + labelText: translate( 'Product & Sale Price' ), + cssClass: 'promotions__promotion-form-card-primary', + fields: { + salePrice: { + component: CurrencyField, + labelText: translate( 'Product Sale Price' ), + isRequired: true, + }, + } + }, + conditions: { + labelText: translate( 'Conditions', { context: 'noun' } ), + cssClass: 'promotions__promotion-form-card-conditions', + fields: { + startDate, + endDate, + } + }, +}; + +/** + * Conditions for all coupon types. + */ +const couponConditions = { + labelText: translate( 'Conditions', { context: 'noun' } ), + cssClass: 'promotions__promotion-form-card-conditions', + fields: { + endDate, + minimumAmount: { + component: CurrencyField, + labelText: translate( 'This promotion requires a minimum purchase' ), + isEnableable: true, + }, + maximumAmount: { + component: CurrencyField, + labelText: translate( 'Don\'t apply this promotion if the order value exceeds a specific amount' ), + isEnableable: true, + }, + usageLimit: { + component: NumberField, + labelText: translate( 'Limit number of times this promotion can be used in total' ), + isEnableable: true, + minValue: 0, + }, + usageLimitPerUser: { + component: NumberField, + labelText: translate( 'Limit total times each customer can use this promotion' ), + isEnableable: true, + minValue: 0, + }, + individualUse: { + component: FormField, + labelText: translate( 'Cannot be combined with any other promotion' ), + isEnableable: true, + defaultValue: true, + }, }, }; @@ -47,34 +207,58 @@ const productSaleModel = { * Promotion Type: Fixed Product Discount (e.g. $5 off any t-shirt) */ const fixedProductModel = { - couponCode: couponCodeField, - fixedDiscount: { - ...fixedDiscountField, - labelText: translate( 'Product Discount', { context: 'noun' } ) + appliesToCoupon, + couponCodeAndDiscount: { + labelText: translate( 'Coupon Code & Discount' ), + cssClass: 'promotions__promotion-form-card-primary', + fields: { + couponCode: couponCodeField, + fixedDiscount: { + ...fixedDiscountField, + labelText: translate( 'Product Discount', { context: 'noun' } ) + }, + }, }, + conditions: couponConditions, }; /** * Promotion Type: Fixed Cart Discount (e.g. $10 off my cart) */ const fixedCartModel = { - couponCode: couponCodeField, - fixedDiscount: { - ...fixedDiscountField, - labelText: translate( 'Cart Discount', { context: 'noun' } ), + appliesWhenCoupon, + couponCodeAndDiscount: { + labelText: translate( 'Coupon Code & Discount' ), + cssClass: 'promotions__promotion-form-card-primary', + fields: { + couponCode: couponCodeField, + fixedDiscount: { + ...fixedDiscountField, + labelText: translate( 'Cart Discount', { context: 'noun' } ), + }, + }, }, + conditions: couponConditions, }; /** * Promotion Type: Percentage Cart Discount (e.g. 10% off my cart) */ const percentCartModel = { - couponCode: couponCodeField, - percentDiscount: { - component: PercentField, - labelText: translate( 'Percent Cart Discount', { context: 'noun' } ), - isRequired: true, + appliesWhenCoupon, + couponCodeAndDiscount: { + labelText: translate( 'Coupon Code & Discount' ), + cssClass: 'promotions__promotion-form-card-primary', + fields: { + couponCode: couponCodeField, + percentDiscount: { + component: PercentField, + labelText: translate( 'Percent Cart Discount', { context: 'noun' } ), + isRequired: true, + }, + }, }, + conditions: couponConditions, }; /** @@ -88,4 +272,3 @@ export default { fixed_cart: fixedCartModel, percent: percentCartModel, }; - diff --git a/client/extensions/woocommerce/app/promotions/promotion-update.js b/client/extensions/woocommerce/app/promotions/promotion-update.js index 43797fa686ad7..4bbcf35fccfd1 100644 --- a/client/extensions/woocommerce/app/promotions/promotion-update.js +++ b/client/extensions/woocommerce/app/promotions/promotion-update.js @@ -6,36 +6,231 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import { localize } from 'i18n-calypso'; +import page from 'page'; +import { debounce } from 'lodash'; /** * Internal dependencies */ import Main from 'components/main'; +import accept from 'lib/accept'; +import { successNotice, errorNotice } from 'state/notices/actions'; +import { getLink } from 'woocommerce/lib/nav-utils'; +import { + fetchPromotions, + updatePromotion, + deletePromotion, +} from 'woocommerce/state/sites/promotions/actions'; +import { fetchProductCategories } from 'woocommerce/state/sites/product-categories/actions'; +import { getProductCategories } from 'woocommerce/state/sites/product-categories/selectors'; +import { editPromotion, clearPromotionEdits } from 'woocommerce/state/ui/promotions/actions'; import { getSelectedSiteWithFallback } from 'woocommerce/state/sites/selectors'; +import { fetchSettingsGeneral } from 'woocommerce/state/sites/settings/general/actions'; +import { getPaymentCurrencySettings } from 'woocommerce/state/sites/settings/general/selectors'; +import { + getPromotionEdits, + getPromotionWithLocalEdits, + getPromotionableProducts, +} from 'woocommerce/state/selectors/promotions'; +import { isValidPromotion } from './helpers'; +import PromotionHeader from './promotion-header'; +import PromotionForm from './promotion-form'; +import { ProtectFormGuard } from 'lib/protect-form'; class PromotionUpdate extends React.Component { static propTypes = { + className: PropTypes.string, + currency: PropTypes.string, + hasEdits: PropTypes.bool.isRequired, + products: PropTypes.array, + productCategories: PropTypes.array, site: PropTypes.shape( { ID: PropTypes.number, + slug: PropTypes.string, } ), - className: PropTypes.string, + promotion: PropTypes.shape( { + id: PropTypes.isRequired, + } ), + editPromotion: PropTypes.func.isRequired, + clearPromotionEdits: PropTypes.func.isRequired, + fetchSettingsGeneral: PropTypes.func.isRequired, + fetchPromotions: PropTypes.func.isRequired, + fetchProductCategories: PropTypes.func.isRequired, + updatePromotion: PropTypes.func.isRequired, + deletePromotion: PropTypes.func.isRequired, + }; + + constructor( props ) { + super( props ); + + this.state = { + busy: false, + }; + } + + componentDidMount() { + const { site } = this.props; + + if ( site && site.ID ) { + this.props.fetchProductCategories( site.ID ); + this.props.fetchPromotions( site.ID ); + this.props.fetchSettingsGeneral( site.ID ); + } + } + + componentWillReceiveProps( newProps ) { + const { site } = this.props; + const newSiteId = ( newProps.site && newProps.site.ID ) || null; + const oldSiteId = ( site && site.ID ) || null; + if ( oldSiteId !== newSiteId ) { + this.props.fetchProductCategories( newSiteId ); + this.props.fetchPromotions( newSiteId ); + this.props.fetchSettingsGeneral( newSiteId ); + } + } + + componentWillUnmount() { + const { site } = this.props; + if ( site ) { + this.props.clearPromotionEdits( site.ID ); + } + } + + onTrash = () => { + const { translate, site, promotion, deletePromotion: dispatchDelete } = this.props; + const areYouSure = translate( 'Are you sure you want to permanently delete this promotion?' ); + accept( areYouSure, accepted => { + if ( ! accepted ) { + return; + } + + const successAction = dispatch => { + this.props.clearPromotionEdits( site.ID ); + + dispatch( successNotice( translate( 'Promotion successfully deleted.' ) ) ); + debounce( () => { + page.redirect( getLink( '/store/promotions/:site/', site ) ); + }, 1000 )(); + }; + const failureAction = () => { + return errorNotice( + translate( 'There was a problem deleting the promotion. Please try again.' ) + ); + }; + dispatchDelete( site.ID, promotion, successAction, failureAction ); + } ); + }; + + onSave = () => { + const { site, promotion, translate } = this.props; + + this.setState( () => ( { busy: true } ) ); + + const getSuccessNotice = () => { + return successNotice( + translate( '%(promotion)s promotion successfully updated.', { + args: { promotion: promotion.name }, + } ), + { + duration: 8000, + } + ); + }; + + const successAction = dispatch => { + this.props.clearPromotionEdits( site.ID ); + dispatch( getSuccessNotice( promotion ) ); + this.setState( () => ( { busy: false } ) ); + }; + + const failureAction = dispatch => { + dispatch( + errorNotice( + translate( 'There was a problem saving the %(promotion)s promotion. Please try again.', { + args: { promotion: promotion.name }, + } ) + ) + ); + this.setState( () => ( { busy: false } ) ); + }; + + this.props.updatePromotion( site.ID, promotion, successAction, failureAction ); }; render() { - const { className } = this.props; + const { + site, + currency, + className, + promotion, + products, + productCategories, + hasEdits, + } = this.props; + const { busy } = this.state; - return
    ; + const isValid = 'undefined' !== typeof site && isValidPromotion( promotion ); + const saveEnabled = isValid && ! busy && hasEdits; + + return ( +
    + + + +
    + ); } } -function mapStateToProps( state ) { +function mapStateToProps( state, ownProps ) { const site = getSelectedSiteWithFallback( state ); + const currencySettings = getPaymentCurrencySettings( state ); + const currency = currencySettings ? currencySettings.value : null; + const promotionId = ownProps.params.promotion; + const promotion = promotionId ? getPromotionWithLocalEdits( state, promotionId, site.ID ) : null; + const products = getPromotionableProducts( state, site.ID ); + const productCategories = getProductCategories( state, site.ID ); + const hasEdits = Boolean( getPromotionEdits( state, promotionId, site.ID ) ); return { + hasEdits, site, + promotion, + currency, + products, + productCategories, }; } -export default connect( mapStateToProps )( localize( PromotionUpdate ) ); +function mapDispatchToProps( dispatch ) { + return bindActionCreators( + { + editPromotion, + clearPromotionEdits, + fetchSettingsGeneral, + fetchPromotions, + fetchProductCategories, + updatePromotion, + deletePromotion, + }, + dispatch + ); +} + +export default connect( mapStateToProps, mapDispatchToProps )( localize( PromotionUpdate ) ); diff --git a/client/extensions/woocommerce/app/promotions/promotions-list-row.js b/client/extensions/woocommerce/app/promotions/promotions-list-row.js index d0444936d602b..182e30dfecaa6 100644 --- a/client/extensions/woocommerce/app/promotions/promotions-list-row.js +++ b/client/extensions/woocommerce/app/promotions/promotions-list-row.js @@ -17,10 +17,14 @@ import TableItem from 'woocommerce/components/table/table-item'; function getPromotionTypeText( promotionType, translate ) { switch ( promotionType ) { + case 'fixed_product': + return translate( 'Product discount coupon' ); + case 'fixed_cart': + return translate( 'Cart discount coupon' ); + case 'percent': + return translate( 'Percent cart discount coupon' ); case 'product_sale': - return translate( 'Product Sale' ); - case 'coupon': - return translate( 'Coupon' ); + return translate( 'Individual product sale' ); } } @@ -30,32 +34,31 @@ function getTimeframeText( promotion, translate, moment ) { if ( promotion.startDate && promotion.endDate ) { return translate( '%(startDate)s - %(endDate)s', { args: { - startDate: moment( promotion.startDate + 'Z' ).format( 'll' ), - endDate: moment( promotion.endDate + 'Z' ).format( 'll' ), + startDate: moment( promotion.startDate ).format( 'll' ), + endDate: moment( promotion.endDate ).format( 'll' ), }, } ); } if ( promotion.endDate ) { return translate( 'Ends on %(endDate)s', { args: { - endDate: moment( promotion.endDate + 'Z' ).format( 'll' ), + endDate: moment( promotion.endDate ).format( 'll' ), }, } ); } if ( promotion.startDate ) { - return translate( '%(startDate)s - No expiration date', { + return translate( '%(startDate)s - No end date', { args: { - startDate: moment( promotion.startDate + 'Z' ).format( 'll' ), + startDate: moment( promotion.startDate ).format( 'll' ), }, } ); } - return translate( 'No expiration date' ); + return translate( 'No end date' ); } const PromotionsListRow = ( { site, promotion, translate, moment } ) => { return ( - // TODO: Replace with individual update link for promotion. - + { promotion.name } diff --git a/client/extensions/woocommerce/app/promotions/promotions-list.js b/client/extensions/woocommerce/app/promotions/promotions-list.js index fe0e0461dd8bc..6a980d1d8fba1 100644 --- a/client/extensions/woocommerce/app/promotions/promotions-list.js +++ b/client/extensions/woocommerce/app/promotions/promotions-list.js @@ -8,14 +8,10 @@ import React from 'react'; import { bindActionCreators } from 'redux'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { localize } from 'i18n-calypso'; /** * Internal dependencies */ -import Button from 'components/button'; -import EmptyContent from 'components/empty-content'; -import { getLink } from 'woocommerce/lib/nav-utils'; import { getSelectedSiteWithFallback } from 'woocommerce/state/sites/selectors'; import { getPromotions, @@ -27,22 +23,18 @@ import PromotionsListTable from './promotions-list-table'; import PromotionsListPagination from './promotions-list-pagination'; import { setPromotionsPage } from 'woocommerce/state/ui/promotions/actions'; -const PromotionsList = props => { - const { site, translate, promotions, promotionsPage, currentPage, perPage } = props; +function promotionContainsString( promotion, textString ) { + const matchString = textString.trim().toLocaleLowerCase(); - const renderEmptyContent = () => { - const emptyContentAction = ( - - ); - return ( - - ); - }; + if ( -1 < promotion.name.toLocaleLowerCase().indexOf( matchString ) ) { + // found in promotion name + return true; + } + return false; +} + +const PromotionsList = props => { + const { site, filteredPromotions, promotionsPage, currentPage, perPage } = props; const switchPage = index => { if ( site ) { @@ -50,17 +42,13 @@ const PromotionsList = props => { } }; - if ( promotions && promotions.length === 0 ) { - return renderEmptyContent(); - } - return (
    = 0 } - totalPromotions={ promotions && promotions.length } + promotionsLoaded={ filteredPromotions && filteredPromotions.length >= 0 } + totalPromotions={ filteredPromotions && filteredPromotions.length } currentPage={ currentPage } perPage={ perPage } onSwitchPage={ switchPage } @@ -70,23 +58,31 @@ const PromotionsList = props => { }; PromotionsList.propTypes = { + searchFilter: PropTypes.string, site: PropTypes.object, promotions: PropTypes.array, + filteredPromotions: PropTypes.array, currentPage: PropTypes.number, perPage: PropTypes.number, promotionsPage: PropTypes.array, }; -function mapStateToProps( state ) { +function mapStateToProps( state, ownProps ) { const site = getSelectedSiteWithFallback( state ); const currentPage = site && getPromotionsCurrentPage( state ); const perPage = site && getPromotionsPerPage( state ); const promotions = site && getPromotions( state, site.ID ); - const promotionsPage = site && getPromotionsPage( state, site.ID, currentPage, perPage ); + const filteredPromotions = + promotions && + promotions.filter( promotion => { + return promotionContainsString( promotion, ownProps.searchFilter ); + } ); + const promotionsPage = site && getPromotionsPage( filteredPromotions, currentPage, perPage ); return { site, promotions, + filteredPromotions, promotionsPage, currentPage, perPage, @@ -102,4 +98,4 @@ function mapDispatchToProps( dispatch ) { ); } -export default connect( mapStateToProps, mapDispatchToProps )( localize( PromotionsList ) ); +export default connect( mapStateToProps, mapDispatchToProps )( PromotionsList ); diff --git a/client/extensions/woocommerce/app/promotions/style.scss b/client/extensions/woocommerce/app/promotions/style.scss index 97918833c067b..492243e283d46 100644 --- a/client/extensions/woocommerce/app/promotions/style.scss +++ b/client/extensions/woocommerce/app/promotions/style.scss @@ -1,4 +1,5 @@ +@import 'fields/style.scss'; @import 'promotion-form.scss'; @import 'promotions-list.scss'; diff --git a/client/extensions/woocommerce/app/settings/email/index.js b/client/extensions/woocommerce/app/settings/email/index.js index c22080bdf7477..d8890eb2b0ceb 100644 --- a/client/extensions/woocommerce/app/settings/email/index.js +++ b/client/extensions/woocommerce/app/settings/email/index.js @@ -17,13 +17,13 @@ import MailChimp from './mailchimp'; import ActionHeader from 'woocommerce/components/action-header'; import SettingsNavigation from '../navigation'; import { getLink } from 'woocommerce/lib/nav-utils'; -import { getSelectedSiteId } from 'state/ui/selectors'; +import { getSelectedSiteWithFallback } from 'woocommerce/state/sites/selectors'; import { mailChimpSaveSettings } from 'woocommerce/state/sites/settings/email/actions'; import { isSavingSettings } from 'woocommerce/state/sites/settings/email/selectors'; -const SettingsEmail = ( { site, siteId, translate, className, params, isSaving, mailChimpSaveSettings: saveSettings } ) => { +const SettingsEmail = ( { site, translate, className, params, isSaving, mailChimpSaveSettings: saveSettings } ) => { const breadcrumbs = [ - ( { translate( 'Settings' ) } ), + ( { translate( 'Settings' ) } ), ( { translate( 'Email' ) } ), ]; @@ -31,7 +31,7 @@ const SettingsEmail = ( { site, siteId, translate, className, params, isSaving, const startWizard = 'wizard' === setup; const onSave = () => ( - saveSettings( siteId ) + saveSettings( site.ID ) ); return ( @@ -42,23 +42,25 @@ const SettingsEmail = ( { site, siteId, translate, className, params, isSaving, - +
    ); }; SettingsEmail.propTypes = { className: PropTypes.string, - siteId: PropTypes.number, - site: PropTypes.object, + site: PropTypes.shape( { + slug: PropTypes.string, + ID: PropTypes.number, + } ), mailChimpSaveSettings: PropTypes.func.isRequired, }; function mapStateToProps( state ) { - const siteId = getSelectedSiteId( state ); + const site = getSelectedSiteWithFallback( state ); return { - siteId, - isSaving: isSavingSettings( state, siteId ), + site, + isSaving: isSavingSettings( state, site.ID ), }; } diff --git a/client/extensions/woocommerce/app/settings/email/mailchimp/getting-started.js b/client/extensions/woocommerce/app/settings/email/mailchimp/getting-started.js index 94f6874453e1f..e6208d0cb1e39 100644 --- a/client/extensions/woocommerce/app/settings/email/mailchimp/getting-started.js +++ b/client/extensions/woocommerce/app/settings/email/mailchimp/getting-started.js @@ -15,7 +15,7 @@ import { localize } from 'i18n-calypso'; const GettingStarted = localize( ( { translate, onClick, isPlaceholder, site, redirectToSettings } ) => { const allow = translate( 'Allow customers to subscribe to your Email list' ); - const send = translate( 'Send abandon cart emails' ); + const send = translate( 'Send abandoned cart emails' ); const create = translate( 'Create purchase-based segments for targeted campaigns' ); const getStarted = translate( 'Get started with MailChimp' ); const list = [ allow, send, create ]; @@ -29,7 +29,7 @@ const GettingStarted = localize( ( { translate, onClick, isPlaceholder, site, re { translate( 'Allow your customers to subscribe to your MailChimp email list.' ) }
    - { ! isPlaceholder && + { ! isPlaceholder && + { ( ! isRequestingMailChimpSettings ) && ( settings && settings.active_tab !== 'sync' ) && + + } +
    + ); + } + return (
    @@ -61,7 +80,6 @@ class MailChimp extends React.Component { site={ site } isPlaceholder={ isRequestingData } onClick={ this.startWizard } - redirectToSettings={ redirectToSettings } /> } { mailChimpIsReady && @@ -88,8 +106,8 @@ MailChimp.propTypes = { isRequestingPlugins: PropTypes.bool, isRequestingMailChimpSettings: PropTypes.bool, settings: PropTypes.object, - redirectToSettings: PropTypes.bool, startWizard: PropTypes.bool, + dashboardView: PropTypes.bool, }; function mapStateToProps( state ) { diff --git a/client/extensions/woocommerce/app/settings/email/mailchimp/mailchimp_dashboard.js b/client/extensions/woocommerce/app/settings/email/mailchimp/mailchimp_dashboard.js index 04844b9d3c7c3..4ff3b6c9bc778 100644 --- a/client/extensions/woocommerce/app/settings/email/mailchimp/mailchimp_dashboard.js +++ b/client/extensions/woocommerce/app/settings/email/mailchimp/mailchimp_dashboard.js @@ -58,7 +58,8 @@ const SyncTab = localize( ( { siteId, translate, syncState, resync, isRequesting const syncing = () => ( - { notice } -
    + + { notice } + + { translate( 'Resync', { comment: 'to synchronize again' } ) } + + +
    { translate( '{{span_info}}Products:{{/span_info}} {{span}}%(products)s{{/span}}', { components: { span_info: , @@ -126,9 +132,6 @@ const SyncTab = localize( ( { siteId, translate, syncState, resync, isRequesting orders } } ) } - - { translate( 'Resync', { comment: 'to synchronize again' } ) } -
    ); @@ -184,14 +187,17 @@ const Settings = localize( ( { translate, settings, oldCheckbox, onChange } ) => /> { translate( 'Subscribe message is checked by default' ) } - + + + { translate( 'Subscribe message' ) } - + + @@ -270,9 +276,11 @@ class MailChimpDashboard extends React.Component {
    -
    MailChimp
    -
    - { translate( 'Allow customers to subscribe to your MailChimp email list' ) } +
    +
    MailChimp
    +
    + { translate( 'Allow customers to subscribe to your MailChimp email list' ) } +
    diff --git a/client/extensions/woocommerce/app/settings/email/mailchimp/setup-mailchimp.js b/client/extensions/woocommerce/app/settings/email/mailchimp/setup-mailchimp.js index dc7d41f7e114a..d41f4e7e56c8f 100644 --- a/client/extensions/woocommerce/app/settings/email/mailchimp/setup-mailchimp.js +++ b/client/extensions/woocommerce/app/settings/email/mailchimp/setup-mailchimp.js @@ -10,14 +10,18 @@ import React from 'react'; /** * Internal dependencies */ -import CampaignDefaultsStep from './setup-steps/campaign-defaults.js'; import Dialog from 'components/dialog'; import { getSiteTitle } from 'state/sites/selectors'; import { getStoreLocation } from 'woocommerce/state/sites/settings/general/selectors'; import { getCurrencyWithEdits } from 'woocommerce/state/ui/payments/currency/selectors'; import { getCurrentUserEmail } from 'state/current-user/selectors'; import { getSiteTimezoneValue } from 'state/selectors'; -import { isSubmittingApiKey, isApiKeyCorrect } from 'woocommerce/state/sites/settings/email/selectors'; +import { + isSubmittingApiKey, + isApiKeyCorrect, + isSubmittingNewsletterSetting, + isSubmittingStoreInfo, + } from 'woocommerce/state/sites/settings/email/selectors'; import KeyInputStep from './setup-steps/key-input.js'; import LogIntoMailchimp from './setup-steps/log-into-mailchimp.js'; import NewsletterSettings from './setup-steps/newsletter-settings.js'; @@ -43,11 +47,15 @@ const steps = { [ LOG_INTO_MAILCHIMP_STEP ]: { number: 0, nextStep: KEY_INPUT_STEP }, [ KEY_INPUT_STEP ]: { number: 1, nextStep: STORE_INFO_STEP }, [ STORE_INFO_STEP ]: { number: 2, nextStep: CAMPAIGN_DEFAULTS_STEP }, - [ CAMPAIGN_DEFAULTS_STEP ]: { number: 3, nextStep: NEWSLETTER_SETTINGS_STEP }, - [ NEWSLETTER_SETTINGS_STEP ]: { number: 4, nextStep: STORE_SYNC }, - [ STORE_SYNC ]: { number: 5, nextStep: null }, + // CAMPAIGN_DEFAULTS_STEP is also number 2 because it happens silently in the + // background and the number here is used for UI purposes + [ CAMPAIGN_DEFAULTS_STEP ]: { number: 2, nextStep: NEWSLETTER_SETTINGS_STEP }, + [ NEWSLETTER_SETTINGS_STEP ]: { number: 3, nextStep: STORE_SYNC }, + [ STORE_SYNC ]: { number: 4, nextStep: null }, }; +const uiStepsCount = steps[ STORE_SYNC ].number + 1; + const storeSettingsRequiredFields = [ 'store_name', 'store_street', 'store_city', 'store_state', 'store_postal_code', 'store_country', 'store_phone', 'store_locale', 'store_timezone', 'store_currency_code', 'admin_email' ]; @@ -78,7 +86,14 @@ class MailChimpSetup extends React.Component { const { active_tab } = nextProps.settings; if ( steps[ this.state.step ].nextStep === active_tab ) { const settings = this.prepareDefaultValues( nextProps ); - this.setState( { step: active_tab, settings } ); + if ( active_tab === CAMPAIGN_DEFAULTS_STEP ) { + // quickly to the next step + // we want CAMPAIGN_DEFAULTS_STEP to happen in the background + // we already have all the required information + this.setState( { step: active_tab, settings }, this.next ); + } else { + this.setState( { step: active_tab, settings } ); + } if ( active_tab === STORE_SYNC ) { nextProps.onClose( 'wizard-completed' ); } @@ -227,20 +242,15 @@ class MailChimpSetup extends React.Component { apiKey={ this.state.api_key_input } isKeyCorrect={ keyCorrect } />; } - if ( STORE_INFO_STEP === step ) { + // we show the same UI view for two steps because the + // CAMPAIGN_DEFAULTS_STEP is executed silently in the background + if ( STORE_INFO_STEP === step || CAMPAIGN_DEFAULTS_STEP === step ) { return ; } - if ( CAMPAIGN_DEFAULTS_STEP === step ) { - return ; - } if ( NEWSLETTER_SETTINGS_STEP === step ) { return -
    MailChimp
    - - -
    - { this.renderStep() } -
    + +
    + + +
    +
    + { this.renderStep() } +
    ); } @@ -330,20 +342,22 @@ MailChimpSetup.propTypes = { }; export default localize( connect( - ( state, props ) => { - const isSaving = isSubmittingApiKey( state, props.siteId ); - const isKeyCorrect = isApiKeyCorrect( state, props.siteId ); + ( state, { siteId } ) => { + const isSavingApiKey = isSubmittingApiKey( state, siteId ); + const isSavingStoreInfo = isSubmittingStoreInfo( state, siteId ); + const isSavingNewsletterSettings = isSubmittingNewsletterSetting( state, siteId ); + const isKeyCorrect = isApiKeyCorrect( state, siteId ); const address = getStoreLocation( state ); const currency = getCurrencyWithEdits( state ); - const isBusy = isSaving; + const isBusy = isSavingApiKey || isSavingStoreInfo || isSavingNewsletterSettings; return { isBusy, address, currency, isKeyCorrect, - siteTitle: getSiteTitle( state, props.siteId ), + siteTitle: getSiteTitle( state, siteId ), currentUserEmail: getCurrentUserEmail( state ), - timezone: getSiteTimezoneValue( state, props.siteId ) + timezone: getSiteTimezoneValue( state, siteId ) }; }, { diff --git a/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/campaign-defaults.js b/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/campaign-defaults.js index fb28989b185fa..1541f14796972 100644 --- a/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/campaign-defaults.js +++ b/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/campaign-defaults.js @@ -11,40 +11,50 @@ import FormFieldset from 'components/forms/form-fieldset'; import FormInputValidation from 'components/forms/form-input-validation'; import FormLabel from 'components/forms/form-label'; import FormTextInput from 'components/forms/form-text-input'; +import FormSettingExplanation from 'components/forms/form-setting-explanation'; import { translate } from 'i18n-calypso'; // Get reed of this, this should not be visible to the user - he does not need this. const CampaignDefaults = ( { storeData = {}, onChange, validateFields } ) => { const fields = [ - { name: 'campaign_from_name', label: translate( 'From', + { name: 'campaign_from_name', explanation: translate( 'This is the name your emails will come from. Use ' + + 'something your subscribers will instantly recognize, like your company name.' ), label: translate( 'Default from name', { comment: 'label for field that informs who sends the message' } ) }, - { name: 'campaign_from_email', label: translate( 'From Email' ) }, - { name: 'campaign_subject', label: translate( 'Subject' ) }, - { name: 'campaign_permission_reminder', label: translate( 'Permission reminder' ) }, + { name: 'campaign_from_email', explanation: translate( 'The address that will receive reply emails. Check it ' + + 'regularly to stay in touch with your audience.' ), label: translate( 'Default from address' ) }, + { name: 'campaign_subject', explanation: translate( 'Keep it relevant and non-spammy.' ), label: translate( 'Default subject' ) }, + { name: 'campaign_permission_reminder', explanation: translate( 'Displayed at the bottom of ' + + 'your emails' ), label: translate( 'Permission reminder' ) }, // campaign_language will be silently passed based on choice from the previous step. ]; return (
    -
    - { translate( 'Campaign Email Settings.' ) } -
    - +

    + { translate( 'Configure the settings for emails sent using your MailChimp account below.' ) } +

    +
    { fields.map( ( item, index ) => ( -
    - - { item.label } - - - { ( validateFields && ! storeData[ item.name ] ) && } -
    + +
    + + { item.label } + + + + { item.explanation } + + { ( validateFields && ! storeData[ item.name ] ) && + } +
    +
    ) ) } - +
    ); }; diff --git a/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/key-input.js b/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/key-input.js index 6573cb86b0540..607433db70407 100644 --- a/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/key-input.js +++ b/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/key-input.js @@ -11,20 +11,14 @@ import FormFieldset from 'components/forms/form-fieldset'; import FormLabel from 'components/forms/form-label'; import FormTextInput from 'components/forms/form-text-input'; import FormInputValidation from 'components/forms/form-input-validation'; +import FormSettingExplanation from 'components/forms/form-setting-explanation'; import { localize } from 'i18n-calypso'; const KeyInputStep = localize( ( { translate, onChange, apiKey, isKeyCorrect } ) => ( -
    - { translate( 'Now that you\'re signed in to MailChimp, you need an API key to start the connection process' ) } -
    -
    -

    { translate( 'To find your Mailchimp API key ' ) } - - { translate( 'click your profile picture, select \'Account\', and go to Extras > API keys.' ) } - - { translate( ' From there, grab an existing key or generate a new one for your store.' ) }

    -
    +

    + { translate( 'Now that you\'re signed in to MailChimp, you need an API key to start the connection process.' ) } +

    { translate( 'Mailchimp API Key:' ) } @@ -40,6 +34,10 @@ const KeyInputStep = localize( ( { translate, onChange, apiKey, isKeyCorrect } ) ? : ) } + + { translate( 'To find your MailChimp API key click your profile picture, select Account and go to Extras ' + + '> API keys. From there, grab an existing key or generate a new one for your store.' ) } +
    ) ); diff --git a/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/log-into-mailchimp.js b/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/log-into-mailchimp.js index ae46318a33bad..f2708f3bfa45e 100644 --- a/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/log-into-mailchimp.js +++ b/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/log-into-mailchimp.js @@ -12,9 +12,8 @@ import { translate } from 'i18n-calypso'; export default () => (
    -
    { translate( 'Get started' ) }

    - { translate( 'First, you\'ll have to have a MailChimp account. If you already have one, log in.' ) } + { translate( 'To get started, you need a MailChimp account. Please log in or register by clicking the button below.' ) }

    - + diff --git a/client/jetpack-connect/plans-grid.jsx b/client/jetpack-connect/plans-grid.jsx index f33570582fca5..fdb6556adc913 100644 --- a/client/jetpack-connect/plans-grid.jsx +++ b/client/jetpack-connect/plans-grid.jsx @@ -27,6 +27,9 @@ class JetpackPlansGrid extends Component { onSelect: PropTypes.func, selectedSite: PropTypes.object, showFirst: PropTypes.bool, + + // Connected + translate: PropTypes.func.isRequired, }; renderConnectHeader() { diff --git a/client/jetpack-connect/plans-landing.jsx b/client/jetpack-connect/plans-landing.jsx index 6c679b6f41d3a..edaf1241ce1e9 100644 --- a/client/jetpack-connect/plans-landing.jsx +++ b/client/jetpack-connect/plans-landing.jsx @@ -106,7 +106,7 @@ class PlansLanding extends Component { > - + diff --git a/client/jetpack-connect/plans-skip-button.jsx b/client/jetpack-connect/plans-skip-button.jsx index 469e3b13d579b..f2eaef1c3e52a 100644 --- a/client/jetpack-connect/plans-skip-button.jsx +++ b/client/jetpack-connect/plans-skip-button.jsx @@ -15,7 +15,7 @@ const PlansSkipButton = ( { onClick, isRtl, translate } ) => (
    ); diff --git a/client/jetpack-connect/plans.jsx b/client/jetpack-connect/plans.jsx index 84affeedaf08e..130acfa14ef25 100644 --- a/client/jetpack-connect/plans.jsx +++ b/client/jetpack-connect/plans.jsx @@ -26,7 +26,6 @@ import { PLAN_JETPACK_BUSINESS, PLAN_JETPACK_BUSINESS_MONTHLY, } from 'lib/plans/constants'; -import { getPlansBySite } from 'state/sites/plans/selectors'; import { recordTracksEvent } from 'state/analytics/actions'; import { getCurrentUser } from 'state/current-user/selectors'; import { addItem } from 'lib/upgrades/actions'; @@ -35,13 +34,17 @@ import QueryPlans from 'components/data/query-plans'; import QuerySitePlans from 'components/data/query-site-plans'; import { isRequestingPlans, getPlanBySlug } from 'state/plans/selectors'; import { getSelectedSite } from 'state/ui/selectors'; -import { canCurrentUser, isRtl, isSiteOnPaidPlan } from 'state/selectors'; +import { + canCurrentUser, + getJetpackConnectRedirectAfterAuth, + isRtl, + isSiteOnPaidPlan, +} from 'state/selectors'; import { getFlowType, isRedirectingToWpAdmin, getSiteSelectedPlan, getGlobalSelectedPlan, - getAuthorizationData, isCalypsoStartedConnection, } from 'state/jetpack-connect/selectors'; import { mc } from 'lib/analytics'; @@ -52,19 +55,11 @@ const CALYPSO_PLANS_PAGE = '/plans/my-plan/'; const JETPACK_ADMIN_PATH = '/wp-admin/admin.php?page=jetpack'; class Plans extends Component { - constructor( props ) { - super( props ); - this.redirecting = false; - } + static propTypes = { showJetpackFreePlan: PropTypes.bool }; - static propTypes = { - sitePlans: PropTypes.object.isRequired, - showJetpackFreePlan: PropTypes.bool, - }; + static defaultProps = { siteSlug: '*' }; - static defaultProps = { - siteSlug: '*', - }; + redirecting = false; componentDidMount() { if ( this.props.isAutomatedTransfer && ! this.redirecting && this.props.selectedSite ) { @@ -124,9 +119,9 @@ class Plans extends Component { return; } - const { queryObject } = this.props.jetpackConnectAuthorize; - if ( queryObject ) { - this.props.goBackToWpAdmin( queryObject.redirect_after_auth ); + const { redirectAfterAuth } = this.props; + if ( redirectAfterAuth ) { + this.props.goBackToWpAdmin( redirectAfterAuth ); } else if ( this.props.selectedSite ) { this.props.goBackToWpAdmin( this.props.selectedSite.URL + JETPACK_ADMIN_PATH ); } @@ -255,13 +250,13 @@ class Plans extends Component { }; render() { - const { isRtlLayout, translate } = this.props; + const { interval, isRtlLayout, selectedSite, showFirst, translate } = this.props; if ( this.redirecting || this.hasPreSelectedPlan() || - ( ! this.props.showFirst && ! this.props.canPurchasePlans ) || - ( ! this.props.showFirst && this.props.hasPlan ) + ( ! showFirst && ! this.props.canPurchasePlans ) || + ( ! showFirst && this.props.hasPlan ) ) { return ; } @@ -271,22 +266,22 @@ class Plans extends Component { return (
    - { this.props.selectedSite ? ( - - ) : null } + { selectedSite && } - + @@ -315,8 +310,7 @@ export default connect( selectedSiteSlug, selectedPlan, isAutomatedTransfer: selectedSite ? isSiteAutomatedTransfer( state, selectedSite.ID ) : false, - sitePlans: getPlansBySite( state, selectedSite ), - jetpackConnectAuthorize: getAuthorizationData( state ), + redirectAfterAuth: getJetpackConnectRedirectAfterAuth( state ), userId: user ? user.ID : null, canPurchasePlans: selectedSite ? canCurrentUser( state, selectedSite.ID, 'manage_options' ) diff --git a/client/jetpack-connect/sso.jsx b/client/jetpack-connect/sso.jsx index c3a8414da2ef1..68e3cfd772f7c 100644 --- a/client/jetpack-connect/sso.jsx +++ b/client/jetpack-connect/sso.jsx @@ -457,7 +457,7 @@ class JetpackSsoForm extends Component { > { this.getReturnToSiteText() } - + diff --git a/client/jetpack-connect/style.scss b/client/jetpack-connect/style.scss index 2a01bdb0fea27..be00903bdd40e 100644 --- a/client/jetpack-connect/style.scss +++ b/client/jetpack-connect/style.scss @@ -99,10 +99,6 @@ .button { width: 100%; } - - .logged-out-form__links .gridicon { - top: 2px; - } } .jetpack-connect__back-button { @@ -467,15 +463,6 @@ word-break: break-word; } -.jetpack-connect__help-button { - .gridicon { - width: 18px; - height: 18px; - position: relative; - top: 4px; - } -} - .jetpack-connect__error-details { margin-bottom: 16px; } diff --git a/client/jetpack-connect/test/__snapshots__/plans-skip-button.jsx.snap b/client/jetpack-connect/test/__snapshots__/plans-skip-button.jsx.snap index 0b882f9ebd4d3..15b2bf5b68aa9 100644 --- a/client/jetpack-connect/test/__snapshots__/plans-skip-button.jsx.snap +++ b/client/jetpack-connect/test/__snapshots__/plans-skip-button.jsx.snap @@ -11,11 +11,11 @@ exports[`PlansSkipButton should render 1`] = ` > Start with free @@ -39,11 +39,11 @@ exports[`PlansSkipButton should render arrow-left in rtl mode 1`] = ` > Start with free diff --git a/client/jetpack-connect/test/__snapshots__/plans.js.snap b/client/jetpack-connect/test/__snapshots__/plans.js.snap index 64c5a40e84906..25010bfb3d5dd 100644 --- a/client/jetpack-connect/test/__snapshots__/plans.js.snap +++ b/client/jetpack-connect/test/__snapshots__/plans.js.snap @@ -215,183 +215,6 @@ ShallowWrapper { } } selectedSiteSlug="an.example.site" - sitePlans={ - Object { - "data": Array [ - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€59.88", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 365, - "isDomainUpgrade": false, - "productName": "Premium", - "productSlug": "jetpack_premium", - "rawDiscount": 0, - "rawPrice": 59.88, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": true, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€155.88", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 365, - "isDomainUpgrade": false, - "productName": "Professional", - "productSlug": "jetpack_business", - "rawDiscount": 0, - "rawPrice": 155.88, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€0", - "freeTrial": false, - "hasDomainCredit": false, - "id": 0, - "interval": -1, - "isDomainUpgrade": false, - "productName": "Free", - "productSlug": "jetpack_free", - "rawDiscount": 0, - "rawPrice": 0, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€6.99", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 31, - "isDomainUpgrade": false, - "productName": "Premium", - "productSlug": "jetpack_premium_monthly", - "rawDiscount": 0, - "rawPrice": 6.99, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€19.99", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 31, - "isDomainUpgrade": false, - "productName": "Professional", - "productSlug": "jetpack_business_monthly", - "rawDiscount": 0, - "rawPrice": 19.99, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€35.88", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 365, - "isDomainUpgrade": false, - "productName": "Personal", - "productSlug": "jetpack_personal", - "rawDiscount": 0, - "rawPrice": 35.88, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€3.50", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 31, - "isDomainUpgrade": false, - "productName": "Personal", - "productSlug": "jetpack_personal_monthly", - "rawDiscount": 0, - "rawPrice": 3.5, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - ], - "error": null, - "hasLoadedFromServer": true, - "isRequesting": false, - } - } siteSlug="*" transaction={ Object { @@ -605,181 +428,6 @@ ShallowWrapper { "visible": true, }, "selectedSiteSlug": "an.example.site", - "sitePlans": Object { - "data": Array [ - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€59.88", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 365, - "isDomainUpgrade": false, - "productName": "Premium", - "productSlug": "jetpack_premium", - "rawDiscount": 0, - "rawPrice": 59.88, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": true, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€155.88", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 365, - "isDomainUpgrade": false, - "productName": "Professional", - "productSlug": "jetpack_business", - "rawDiscount": 0, - "rawPrice": 155.88, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€0", - "freeTrial": false, - "hasDomainCredit": false, - "id": 0, - "interval": -1, - "isDomainUpgrade": false, - "productName": "Free", - "productSlug": "jetpack_free", - "rawDiscount": 0, - "rawPrice": 0, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€6.99", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 31, - "isDomainUpgrade": false, - "productName": "Premium", - "productSlug": "jetpack_premium_monthly", - "rawDiscount": 0, - "rawPrice": 6.99, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€19.99", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 31, - "isDomainUpgrade": false, - "productName": "Professional", - "productSlug": "jetpack_business_monthly", - "rawDiscount": 0, - "rawPrice": 19.99, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€35.88", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 365, - "isDomainUpgrade": false, - "productName": "Personal", - "productSlug": "jetpack_personal", - "rawDiscount": 0, - "rawPrice": 35.88, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€3.50", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 31, - "isDomainUpgrade": false, - "productName": "Personal", - "productSlug": "jetpack_personal_monthly", - "rawDiscount": 0, - "rawPrice": 3.5, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - ], - "error": null, - "hasLoadedFromServer": true, - "isRequesting": false, - }, "siteSlug": "*", "transaction": Object { "domainDetails": null, @@ -1026,183 +674,6 @@ ShallowWrapper { } } selectedSiteSlug="an.example.site" - sitePlans={ - Object { - "data": Array [ - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€59.88", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 365, - "isDomainUpgrade": false, - "productName": "Premium", - "productSlug": "jetpack_premium", - "rawDiscount": 0, - "rawPrice": 59.88, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": true, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€155.88", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 365, - "isDomainUpgrade": false, - "productName": "Professional", - "productSlug": "jetpack_business", - "rawDiscount": 0, - "rawPrice": 155.88, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€0", - "freeTrial": false, - "hasDomainCredit": false, - "id": 0, - "interval": -1, - "isDomainUpgrade": false, - "productName": "Free", - "productSlug": "jetpack_free", - "rawDiscount": 0, - "rawPrice": 0, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€6.99", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 31, - "isDomainUpgrade": false, - "productName": "Premium", - "productSlug": "jetpack_premium_monthly", - "rawDiscount": 0, - "rawPrice": 6.99, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€19.99", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 31, - "isDomainUpgrade": false, - "productName": "Professional", - "productSlug": "jetpack_business_monthly", - "rawDiscount": 0, - "rawPrice": 19.99, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€35.88", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 365, - "isDomainUpgrade": false, - "productName": "Personal", - "productSlug": "jetpack_personal", - "rawDiscount": 0, - "rawPrice": 35.88, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - Object { - "autoRenew": false, - "autoRenewDateMoment": null, - "canStartTrial": false, - "currencyCode": "EUR", - "currentPlan": false, - "discountReason": null, - "expiryMoment": null, - "formattedDiscount": "€0", - "formattedOriginalPrice": "€0", - "formattedPrice": "€3.50", - "freeTrial": false, - "hasDomainCredit": false, - "id": null, - "interval": 31, - "isDomainUpgrade": false, - "productName": "Personal", - "productSlug": "jetpack_personal_monthly", - "rawDiscount": 0, - "rawPrice": 3.5, - "subscribedDayMoment": "2017-10-18T22:00:00.000Z", - "userFacingExpiryMoment": null, - "userIsOwner": false, - }, - ], - "error": null, - "hasLoadedFromServer": true, - "isRequesting": false, - } - } siteSlug="*" transaction={ Object { @@ -1235,74 +706,10 @@ ShallowWrapper { /> ( plan.productSlug === currentPlan ? { ...plan, currentPlan: true } : plan ) - ), - }; -} - export const DEFAULT_PROPS = { basePlansPath: BASE_PLANS_PATH, calypsoStartedConnection: false, @@ -442,7 +257,6 @@ export const DEFAULT_PROPS = { selectedSite: SELECTED_SITE, selectedSiteSlug: SITE_SLUG, selectPlanInAdvance: noop, - sitePlans: getSitePlans(), siteSlug: PLANS_SLUG, transaction: TRANSACTION, translate: identity, diff --git a/client/jetpack-connect/test/plans.js b/client/jetpack-connect/test/plans.js index 926b77702a1da..66350aaed143b 100644 --- a/client/jetpack-connect/test/plans.js +++ b/client/jetpack-connect/test/plans.js @@ -13,8 +13,7 @@ import React from 'react'; */ import PlansGrid from '../plans-grid'; import QueryPlans from 'components/data/query-plans'; -import { DEFAULT_PROPS, getSitePlans, SELECTED_SITE, SITE_PLAN_PRO } from './lib/plans'; -import { PLAN_JETPACK_BUSINESS } from 'lib/plans/constants'; +import { DEFAULT_PROPS, SELECTED_SITE, SITE_PLAN_PRO } from './lib/plans'; import { PlansTestComponent as Plans } from '../plans'; jest.mock( 'components/data/query-plans', () => 'components--data--query-plans' ); @@ -37,7 +36,6 @@ describe( 'Plans', () => { { ...DEFAULT_PROPS } hasPlan={ true } selectedSite={ { ...SELECTED_SITE, plan: SITE_PLAN_PRO } } - sitePlans={ getSitePlans( PLAN_JETPACK_BUSINESS ) } /> ); @@ -53,7 +51,6 @@ describe( 'Plans', () => { hasPlan={ true } selectedSite={ { ...SELECTED_SITE, plan: SITE_PLAN_PRO } } showFirst={ true } - sitePlans={ getSitePlans( PLAN_JETPACK_BUSINESS ) } /> ); @@ -70,7 +67,6 @@ describe( 'Plans', () => { wrapper.setProps( { hasPlan: true, selectedSite: { ...SELECTED_SITE, plan: SITE_PLAN_PRO }, - sitePlans: getSitePlans( PLAN_JETPACK_BUSINESS ), } ); expect( redirect.mock.calls.length ).toBe( 1 ); @@ -92,7 +88,6 @@ describe( 'Plans', () => { plan: SITE_PLAN_PRO, is_automated_transfer: true, } } - sitePlans={ getSitePlans( PLAN_JETPACK_BUSINESS ) } /> ); diff --git a/client/layout/guided-tours/config.js b/client/layout/guided-tours/config.js index 973885dbe49ae..c417cb2e41a72 100644 --- a/client/layout/guided-tours/config.js +++ b/client/layout/guided-tours/config.js @@ -11,6 +11,7 @@ import { GDocsIntegrationTour } from 'layout/guided-tours/tours/gdocs-integratio import { SimplePaymentsTour } from 'layout/guided-tours/tours/simple-payments-tour'; import { EditorBasicsTour } from 'layout/guided-tours/tours/editor-basics-tour'; import { MediaBasicsTour } from 'layout/guided-tours/tours/media-basics-tour'; +import { ActivityLogTour } from 'layout/guided-tours/tours/activity-log-tour'; export default combineTours( { main: MainTour, @@ -19,4 +20,5 @@ export default combineTours( { tutorialSitePreview: TutorialSitePreviewTour, gdocsIntegrationTour: GDocsIntegrationTour, simplePaymentsTour: SimplePaymentsTour, + activityLogTour: ActivityLogTour, } ); diff --git a/client/layout/guided-tours/tours/activity-log-tour.js b/client/layout/guided-tours/tours/activity-log-tour.js new file mode 100644 index 0000000000000..e161169d6756c --- /dev/null +++ b/client/layout/guided-tours/tours/activity-log-tour.js @@ -0,0 +1,107 @@ +/** + * External dependencies + * + * @format + */ + +import React from 'react'; +import { translate } from 'i18n-calypso'; +import { overEvery as and } from 'lodash'; + +/** + * Internal dependencies + */ +import { + makeTour, + Tour, + Step, + ButtonRow, + Next, + Quit, + Continue, +} from 'layout/guided-tours/config-elements'; +import { isNotNewUser } from 'state/ui/guided-tours/contexts'; +import { isDesktop } from 'lib/viewport'; + +export const ActivityLogTour = makeTour( + + +

    + { translate( + '{{strong}}Need a hand?{{/strong}} ' + + "We'd love to show you around the Activity Log, " + + 'and tell you how you can use it to restore a previous state of your site.', + { components: { strong: } } + ) } +

    + + { translate( "Let's go!" ) } + { translate( 'No, thanks.' ) } + + + +

    + { translate( + 'Each of these blocks represent a daily backup of your site. ' + + 'To restore your site to a given day, click on the respective rewind button.' + ) } +

    + + + { translate( 'Do this later.' ) } + +
    + +

    + { translate( + 'You can also click on each daily block to show more details. ' + + 'When expanded, it will display every event that happened on that day.' + ) } +

    + + + { translate( 'Click on the block to expand it and continue.' ) } + + +
    + +

    + { translate( 'Each of these events represent an action that took place in your site.' ) } +

    + + + { translate( 'Do this later.' ) } + +
    + +

    + { translate( + "In here you'll find each event's options, such as rewinding one by one. " + + 'Now, go explore!' + ) } +

    + + { translate( 'Got it, thanks!' ) } + +
    + +); diff --git a/client/layout/masterbar/style.scss b/client/layout/masterbar/style.scss index eac10f34eb991..83451d73a9f45 100644 --- a/client/layout/masterbar/style.scss +++ b/client/layout/masterbar/style.scss @@ -3,7 +3,7 @@ $autobar-height: 20px; // The WordPress.com Masterbar .masterbar { - background: var( --masterbar-background-color ); + background: var( --masterbar-background ); border-bottom: 1px solid var( --masterbar-border-color ); color: var( --masterbar-color ); font-size: 16px; @@ -212,7 +212,7 @@ $autobar-height: 20px; // active state when editing .is-group-editor & { - background: darken( $masterbar-color, 17% ); + background: var( --masterbar-item-new-editor-background ); color: $white; } @@ -222,7 +222,7 @@ $autobar-height: 20px; } .is-group-editor &:hover { - background: darken( $masterbar-color, 13% ); + background: var( --masterbar-item-new-editor-hover-background ); } } @@ -391,8 +391,8 @@ $autobar-height: 20px; } .is-group-editor & { - background: darken( $masterbar-color, 12% ); - border-left: 1px solid darken( $masterbar-color, 5% ); + background: var( --masterbar-toggle-drafts-editor-background ); + border-left: 1px solid var( --masterbar-toggle-drafts-editor-border-color ); .count { color: $gray-light; @@ -400,7 +400,7 @@ $autobar-height: 20px; } .is-group-editor &:hover { - background: darken( $masterbar-color, 17% ); + background: var( --masterbar-toggle-drafts-editor-hover-background ); .count { color: $white; diff --git a/client/layout/sidebar/style.scss b/client/layout/sidebar/style.scss index f70ad17faa425..cdf9e4702c668 100644 --- a/client/layout/sidebar/style.scss +++ b/client/layout/sidebar/style.scss @@ -232,6 +232,10 @@ form.sidebar__button input { a { color: $white; + .sidebar__menu-link-secondary-text { + color: inherit; + } + &:first-child:after { background: linear-gradient( to right, diff --git a/client/layout/style.scss b/client/layout/style.scss index bc04110a49d66..f18b5af455997 100644 --- a/client/layout/style.scss +++ b/client/layout/style.scss @@ -191,7 +191,7 @@ transition-delay: 0.4s; @include breakpoint( "<480px" ) { - background: var( --masterbar-background-color ); + background: var( --masterbar-background ); } } diff --git a/client/lib/abtest/active-tests.js b/client/lib/abtest/active-tests.js index aac06279d76ba..984cedbb7375c 100644 --- a/client/lib/abtest/active-tests.js +++ b/client/lib/abtest/active-tests.js @@ -89,16 +89,6 @@ export default { allowExistingUsers: true, localeTargets: 'any', }, - checkoutPaymentMethodTabs: { - datestamp: '20171019', - variations: { - tabs: 50, - original: 50, - }, - defaultVariation: 'original', - allowExistingUsers: true, - localeTargets: 'any', - }, unlimitedThemeNudge: { datestamp: '20171016', variations: { diff --git a/client/lib/accept/dialog.jsx b/client/lib/accept/dialog.jsx index dfef3b07785ef..af77a48338ca3 100644 --- a/client/lib/accept/dialog.jsx +++ b/client/lib/accept/dialog.jsx @@ -1,12 +1,9 @@ +/** @format */ /** * External dependencies - * - * @format */ - +import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import React from 'react'; -import createReactClass from 'create-react-class'; import { localize } from 'i18n-calypso'; import classnames from 'classnames'; @@ -15,31 +12,26 @@ import classnames from 'classnames'; */ import Dialog from 'components/dialog'; -const AcceptDialog = createReactClass( { - displayName: 'AcceptDialog', +class AcceptDialog extends Component { + static displayName = 'AcceptDialog'; - propTypes: { + static propTypes = { translate: PropTypes.func, message: PropTypes.node, onClose: PropTypes.func.isRequired, confirmButtonText: PropTypes.node, cancelButtonText: PropTypes.node, options: PropTypes.object, - }, + }; - getInitialState: function() { - return { isVisible: true }; - }, + state = { isVisible: true }; - onClose: function( action ) { + onClose = action => { + this.setState( { isVisible: false } ); this.props.onClose( 'accept' === action ); + }; - if ( this.isMounted() ) { - this.setState( { isVisible: false } ); - } - }, - - getActionButtons: function() { + getActionButtons = () => { const { options } = this.props; const isScary = options && options.isScary; const additionalClassNames = classnames( { 'is-scary': isScary } ); @@ -59,9 +51,9 @@ const AcceptDialog = createReactClass( { additionalClassNames, }, ]; - }, + }; - render: function() { + render() { if ( ! this.state.isVisible ) { return null; } @@ -76,7 +68,7 @@ const AcceptDialog = createReactClass( { { this.props.message } ); - }, -} ); + } +} export default localize( AcceptDialog ); diff --git a/client/lib/analytics/ad-tracking.js b/client/lib/analytics/ad-tracking.js index fa5f032c74183..c1b0a832a2a2f 100644 --- a/client/lib/analytics/ad-tracking.js +++ b/client/lib/analytics/ad-tracking.js @@ -7,7 +7,7 @@ import async from 'async'; import cookie from 'cookie'; import debugFactory from 'debug'; -import { assign, clone, cloneDeep, noop, some } from 'lodash'; +import { assign, clone, cloneDeep, noop } from 'lodash'; import { v4 as uuid } from 'uuid'; /** @@ -39,7 +39,7 @@ const isQuantcastEnabled = true; const isTwitterEnabled = true; const isAolEnabled = true; const isLinkedinEnabled = true; -const isYandexEnabled = true; +let isYandexEnabled = true; const isOutbrainEnabled = true; const isAtlasEnabled = false; const isPandoraEnabled = false; @@ -322,8 +322,10 @@ function loadTrackingScripts( callback ) { } ); } - async.series( scripts, function( errors ) { - if ( ! some( errors ) ) { + async.series( scripts, function( error ) { + if ( error ) { + debug( 'Some scripts failed to load: ', error ); + } else { // init Facebook if ( isFacebookEnabled ) { window.fbq( 'init', TRACKING_IDS.facebookInit ); @@ -360,7 +362,12 @@ function loadTrackingScripts( callback ) { // init Yandex counter if ( isYandexEnabled ) { - window.yaCounter45268389 = new window.Ya.Metrika( { id: 45268389 } ); + if ( window.Ya ) { + window.yaCounter45268389 = new window.Ya.Metrika( { id: 45268389 } ); + } else { + debug( "Error: Yandex's window.Ya not ready or missing" ); + isYandexEnabled = false; + } } hasFinishedFetchingScripts = true; @@ -369,8 +376,6 @@ function loadTrackingScripts( callback ) { callback(); } debug( 'Scripts loaded successfully' ); - } else { - debug( 'Some scripts failed to load: ', errors ); } } ); } diff --git a/client/lib/analytics/index.js b/client/lib/analytics/index.js index b4cf1b2e49b24..0f9b49b8449d7 100644 --- a/client/lib/analytics/index.js +++ b/client/lib/analytics/index.js @@ -160,6 +160,11 @@ function buildQuerystringNoPrefix( group, name ) { // this helps avoid some nasty coupling, but it's not the cleanest code - sorry. let mostRecentUrlPath = null; +// pathCounter is used to keep track of the order of calypso_page_view Tracks +// events. The pathCounter value is appended to the last_pageview_path_with_count and +// this_pageview_path_with_count Tracks event props. +let pathCounter = 0; + if ( typeof window !== 'undefined' ) { window.addEventListener( 'popstate', function() { // throw away our URL value if the user used the back/forward buttons @@ -241,7 +246,10 @@ const analytics = { // add delay to avoid stale `_dl` in recorded calypso_page_view event details // `_dl` (browserdocumentlocation) is read from the current URL by external JavaScript setTimeout( () => { - params.last_pageview_path = mostRecentUrlPath; + params.last_pageview_path_with_count = + mostRecentUrlPath + '(' + pathCounter.toString() + ')'; + pathCounter++; + params.this_pageview_path_with_count = urlPath + '(' + pathCounter.toString() + ')'; analytics.tracks.recordPageView( urlPath, params ); analytics.ga.recordPageView( urlPath, pageTitle ); analytics.emit( 'page-view', urlPath, pageTitle ); diff --git a/client/lib/cart-values/cart-items.js b/client/lib/cart-values/cart-items.js index b4d374e10f88d..115b968e48aa1 100644 --- a/client/lib/cart-values/cart-items.js +++ b/client/lib/cart-values/cart-items.js @@ -50,6 +50,7 @@ import { } from 'lib/products-values'; import sortProducts from 'lib/products-values/sort'; import { PLAN_PERSONAL } from 'lib/plans/constants'; +import { domainProductSlugs } from 'lib/domains/constants'; import { PLAN_FREE, @@ -67,13 +68,11 @@ import { * @param {Object} newCartItem - new item as `CartItemValue` object * @returns {Function} the function that adds the item to a shopping cart */ -function add( newCartItem ) { +export function add( newCartItem ) { function appendItem( products ) { - var isDuplicate; - products = products || []; - isDuplicate = products.some( function( existingCartItem ) { + const isDuplicate = products.some( function( existingCartItem ) { return isEqual( newCartItem, existingCartItem ); } ); @@ -99,7 +98,7 @@ function add( newCartItem ) { * @param {Object} cart - the existing shopping cart * @returns {Boolean} whether or not the item should replace the cart */ -function cartItemShouldReplaceCart( cartItem, cart ) { +export function cartItemShouldReplaceCart( cartItem, cart ) { if ( isRenewal( cartItem ) && ! isPrivacyProtection( cartItem ) && @@ -134,7 +133,7 @@ function cartItemShouldReplaceCart( cartItem, cart ) { * @param {Object} cartItemToRemove - item as `CartItemValue` object * @returns {Function} the function that removes the item from a shopping cart */ -function remove( cartItemToRemove ) { +export function remove( cartItemToRemove ) { function rejectItem( products ) { return reject( products, function( existingCartItem ) { return ( @@ -157,9 +156,9 @@ function remove( cartItemToRemove ) { * @param {bool} domainsWithPlansOnly - Whether we should consider domains as dependents of products * @returns {Function} the function that removes the items from a shopping cart */ -function removeItemAndDependencies( cartItemToRemove, cart, domainsWithPlansOnly ) { - var dependencies = getDependentProducts( cartItemToRemove, cart, domainsWithPlansOnly ), - changes = dependencies.map( remove ).concat( remove( cartItemToRemove ) ); +export function removeItemAndDependencies( cartItemToRemove, cart, domainsWithPlansOnly ) { + const dependencies = getDependentProducts( cartItemToRemove, cart, domainsWithPlansOnly ); + const changes = dependencies.map( remove ).concat( remove( cartItemToRemove ) ); return flow.apply( null, changes ); } @@ -172,7 +171,7 @@ function removeItemAndDependencies( cartItemToRemove, cart, domainsWithPlansOnly * @param {bool} domainsWithPlansOnly - Whether we should consider domains as dependents of products * @returns {Object[]} the list of dependency items in the shopping cart */ -function getDependentProducts( cartItem, cart, domainsWithPlansOnly ) { +export function getDependentProducts( cartItem, cart, domainsWithPlansOnly ) { const dependentProducts = getAll( cart ).filter( function( existingCartItem ) { return isDependentProduct( cartItem, existingCartItem, domainsWithPlansOnly ); } ); @@ -192,7 +191,7 @@ function getDependentProducts( cartItem, cart, domainsWithPlansOnly ) { * @param {Object} cart - cart as `CartValue` object * @returns {Object[]} the list of items in the shopping cart as `CartItemValue` objects */ -function getAll( cart ) { +export function getAll( cart ) { return ( cart && cart.products ) || []; } @@ -203,7 +202,7 @@ function getAll( cart ) { * * @returns {Object[]} the sorted list of items in the shopping cart */ -function getAllSorted( cart ) { +export function getAllSorted( cart ) { return sortProducts( getAll( cart ) ); } @@ -213,7 +212,7 @@ function getAllSorted( cart ) { * @param {Object} cart - cart as `CartValue` object * @returns {Array} an array of renewal items */ -function getRenewalItems( cart ) { +export function getRenewalItems( cart ) { return getAll( cart ).filter( isRenewal ); } @@ -223,7 +222,7 @@ function getRenewalItems( cart ) { * @param {Object} cart - cart as `CartValue` object * @returns {boolean} true if there is at least one item with free trial, false otherwise */ -function hasFreeTrial( cart ) { +export function hasFreeTrial( cart ) { return some( getAll( cart ), 'free_trial' ); } @@ -233,15 +232,15 @@ function hasFreeTrial( cart ) { * @param {Object} cart - cart as `CartValue` object * @returns {boolean} true if there is at least one plan, false otherwise */ -function hasPlan( cart ) { +export function hasPlan( cart ) { return cart && some( getAll( cart ), isPlan ); } -function hasPremiumPlan( cart ) { +export function hasPremiumPlan( cart ) { return some( getAll( cart ), isPremium ); } -function hasDomainCredit( cart ) { +export function hasDomainCredit( cart ) { return cart.has_bundle_credit || hasPlan( cart ); } @@ -253,13 +252,13 @@ function hasDomainCredit( cart ) { * * @returns {Boolean} - Whether or not the cart contains a domain with that TLD */ -function hasTld( cart, tld ) { +export function hasTld( cart, tld ) { return some( getDomainRegistrations( cart ), function( cartItem ) { return getDomainRegistrationTld( cartItem ) === '.' + tld; } ); } -function getTlds( cart ) { +export function getTlds( cart ) { return uniq( map( getDomainRegistrations( cart ), function( cartItem ) { return trimStart( getDomainRegistrationTld( cartItem ), '.' ); @@ -267,7 +266,7 @@ function getTlds( cart ) { ); } -function getDomainRegistrationTld( cartItem ) { +export function getDomainRegistrationTld( cartItem ) { if ( ! isDomainRegistration( cartItem ) ) { throw new Error( 'This function only works on domain registration cart ' + 'items.' ); } @@ -282,7 +281,7 @@ function getDomainRegistrationTld( cartItem ) { * @returns {boolean} true if all items have free trial, false otherwise * @todo This will fail when a domain is purchased with a plan, as the domain will be included in the free trial */ -function hasOnlyFreeTrial( cart ) { +export function hasOnlyFreeTrial( cart ) { return cart.products && findFreeTrial( cart ) && every( getAll( cart ), { cost: 0 } ); } @@ -293,7 +292,7 @@ function hasOnlyFreeTrial( cart ) { * @param {Object} productSlug - the unique string that identifies the product * @returns {boolean} true if there is at least one item of the specified product type, false otherwise */ -function hasProduct( cart, productSlug ) { +export function hasProduct( cart, productSlug ) { return getAll( cart ).some( function( cartItem ) { return cartItem.product_slug === productSlug; } ); @@ -307,7 +306,7 @@ function hasProduct( cart, productSlug ) { * @param {Object} productSlug - the unique string that identifies the product * @returns {boolean} true if all the products in the cart are of the productSlug type */ -function hasOnlyProductsOf( cart, productSlug ) { +export function hasOnlyProductsOf( cart, productSlug ) { return cart.products && every( getAll( cart ), { product_slug: productSlug } ); } @@ -317,15 +316,15 @@ function hasOnlyProductsOf( cart, productSlug ) { * @param {Object} cart - cart as `CartValue` object * @returns {boolean} true if there is at least one domain registration item, false otherwise */ -function hasDomainRegistration( cart ) { +export function hasDomainRegistration( cart ) { return some( getAll( cart ), isDomainRegistration ); } -function hasOnlyDomainRegistrationsWithPrivacySupport( cart ) { +export function hasOnlyDomainRegistrationsWithPrivacySupport( cart ) { return every( getDomainRegistrations( cart ), privacyAvailable ); } -function hasDomainMapping( cart ) { +export function hasDomainMapping( cart ) { return some( getAll( cart ), isDomainMapping ); } @@ -335,17 +334,37 @@ function hasDomainMapping( cart ) { * @param {Object} cart - cart as `CartValue` object * @returns {boolean} true if there is at least one renewal item, false otherwise */ -function hasRenewalItem( cart ) { +export function hasRenewalItem( cart ) { return some( getAll( cart ), isRenewal ); } +/** + * Determines whether there is at least one domain transfer item in the specified shopping cart. + * + * @param {Object} cart - cart as `CartValue` object + * @returns {boolean} true if there is at least one domain transfer item, false otherwise + */ +export function hasTransferProduct( cart ) { + return some( getAll( cart ), isTransfer ); +} + +/** + * Retrieves all the domain transfer items in the specified shopping cart. + * + * @param {Object} cart - cart as `CartValue` object + * @returns {Object[]} the list of the corresponding items in the shopping cart as `CartItemValue` objects + */ +export function getDomainTransfers( cart ) { + return filter( getAll( cart ), { product_slug: domainProductSlugs.TRANSFER_IN } ); +} + /** * Determines whether all items are renewal items in the specified shopping cart. * * @param {Object} cart - cart as `CartValue` object * @returns {boolean} true if there are only renewal items, false otherwise */ -function hasOnlyRenewalItems( cart ) { +export function hasOnlyRenewalItems( cart ) { return every( getAll( cart ), isRenewal ); } @@ -356,7 +375,7 @@ function hasOnlyRenewalItems( cart ) { * @param {Object} cart - cart as `CartValue` object * @returns {boolean} true if any product in the cart renews */ -function hasRenewableSubscription( cart ) { +export function hasRenewableSubscription( cart ) { return cart.products && some( getAll( cart ), cartItem => cartItem.bill_period > 0 ); } @@ -364,10 +383,10 @@ function hasRenewableSubscription( cart ) { * Creates a new shopping cart item for a plan. * * @param {Object} productSlug - the unique string that identifies the product - * @param {boolean} isFreeTrial - optionally specifies if this is a free trial or not + * @param {boolean} isFreeTrialItem - optionally specifies if this is a free trial or not * @returns {Object} the new item as `CartItemValue` object */ -function planItem( productSlug, isFreeTrial = false ) { +export function planItem( productSlug, isFreeTrialItem = false ) { // Free plan doesn't have shopping cart. if ( productSlug === PLAN_FREE ) { return null; @@ -375,7 +394,7 @@ function planItem( productSlug, isFreeTrial = false ) { return { product_slug: productSlug, - free_trial: isFreeTrial, + free_trial: isFreeTrialItem, }; } @@ -386,7 +405,7 @@ function planItem( productSlug, isFreeTrial = false ) { * @param {Object} properties - list of properties * @returns {Object} the new item as `CartItemValue` object */ -function personalPlan( slug, properties ) { +export function personalPlan( slug, properties ) { return planItem( slug, properties.isFreeTrial ); } @@ -397,7 +416,7 @@ function personalPlan( slug, properties ) { * @param {Object} properties - list of properties * @returns {Object} the new item as `CartItemValue` object */ -function premiumPlan( slug, properties ) { +export function premiumPlan( slug, properties ) { return planItem( slug, properties.isFreeTrial ); } @@ -408,7 +427,7 @@ function premiumPlan( slug, properties ) { * @param {Object} properties - list of properties * @returns {Object} the new item as `CartItemValue` object */ -function businessPlan( slug, properties ) { +export function businessPlan( slug, properties ) { return planItem( slug, properties.isFreeTrial ); } @@ -420,8 +439,8 @@ function businessPlan( slug, properties ) { * @param {string} source - optional source for the domain item, e.g. `getdotblog`. * @returns {Object} the new item as `CartItemValue` object */ -function domainItem( productSlug, domain, source ) { - var extra = source ? { extra: { source: source } } : undefined; +export function domainItem( productSlug, domain, source ) { + const extra = source ? { extra: { source: source } } : undefined; return Object.assign( { @@ -432,7 +451,7 @@ function domainItem( productSlug, domain, source ) { ); } -function themeItem( themeSlug, source ) { +export function themeItem( themeSlug, source ) { return { product_slug: 'premium_theme', meta: themeSlug, @@ -448,7 +467,7 @@ function themeItem( themeSlug, source ) { * @param {Object} properties - list of properties * @returns {Object} the new item as `CartItemValue` object */ -function domainRegistration( properties ) { +export function domainRegistration( properties ) { return assign( domainItem( properties.productSlug, properties.domain, properties.source ), { is_domain_registration: true, ...( properties.extra ? { extra: properties.extra } : {} ), @@ -461,7 +480,7 @@ function domainRegistration( properties ) { * @param {Object} properties - list of properties * @returns {Object} the new item as `CartItemValue` object */ -function domainMapping( properties ) { +export function domainMapping( properties ) { return domainItem( 'domain_map', properties.domain, properties.source ); } @@ -471,7 +490,7 @@ function domainMapping( properties ) { * @param {Object} properties - list of properties * @returns {Object} the new item as `CartItemValue` object */ -function siteRedirect( properties ) { +export function siteRedirect( properties ) { return domainItem( 'offsite_redirect', properties.domain, properties.source ); } @@ -481,7 +500,7 @@ function siteRedirect( properties ) { * @param {Object} properties - list of properties * @returns {Object} the new item as `CartItemValue` object */ -function domainPrivacyProtection( properties ) { +export function domainPrivacyProtection( properties ) { return domainItem( 'private_whois', properties.domain, properties.source ); } @@ -491,24 +510,34 @@ function domainPrivacyProtection( properties ) { * @param {Object} properties - list of properties * @returns {Object} the new item as `CartItemValue` object */ -function domainRedemption( properties ) { +export function domainRedemption( properties ) { return domainItem( 'domain_redemption', properties.domain, properties.source ); } -function googleApps( properties ) { +/** + * Creates a new shopping cart item for an incoming domain transfer. + * + * @param {Object} properties - list of properties + * @returns {Object} the new item as `CartItemValue` object + */ +export function domainTransfer( properties ) { + return domainItem( domainProductSlugs.TRANSFER_IN, properties.domain, properties.source ); +} + +export function googleApps( properties ) { const productSlug = properties.product_slug || 'gapps', item = domainItem( productSlug, properties.meta ? properties.meta : properties.domain ); return assign( item, { extra: { google_apps_users: properties.users } } ); } -function googleAppsExtraLicenses( properties ) { - var item = domainItem( 'gapps_extra_license', properties.domain, properties.source ); +export function googleAppsExtraLicenses( properties ) { + const item = domainItem( 'gapps_extra_license', properties.domain, properties.source ); return assign( item, { extra: { google_apps_users: properties.users } } ); } -function fillGoogleAppsRegistrationData( cart, registrationData ) { +export function fillGoogleAppsRegistrationData( cart, registrationData ) { const googleAppsItems = filter( getAll( cart ), isGoogleApps ); return flow.apply( null, @@ -519,47 +548,47 @@ function fillGoogleAppsRegistrationData( cart, registrationData ) { ); } -function hasGoogleApps( cart ) { +export function hasGoogleApps( cart ) { return some( getAll( cart ), isGoogleApps ); } -function customDesignItem() { +export function customDesignItem() { return { product_slug: 'custom-design', }; } -function guidedTransferItem() { +export function guidedTransferItem() { return { product_slug: 'guided_transfer', }; } -function noAdsItem() { +export function noAdsItem() { return { product_slug: 'no-adverts/no-adverts.php', }; } -function videoPressItem() { +export function videoPressItem() { return { product_slug: 'videopress', }; } -function unlimitedSpaceItem() { +export function unlimitedSpaceItem() { return { product_slug: 'unlimited_space', }; } -function unlimitedThemesItem() { +export function unlimitedThemesItem() { return { product_slug: 'unlimited_themes', }; } -function spaceUpgradeItem( slug ) { +export function spaceUpgradeItem( slug ) { return { product_slug: slug, }; @@ -572,7 +601,7 @@ function spaceUpgradeItem( slug ) { * @param {Object} properties - list of properties * @returns {Object} the new item as `CartItemValue` object */ -function getItemForPlan( plan, properties ) { +export function getItemForPlan( plan, properties ) { properties = properties || {}; switch ( plan.product_slug ) { @@ -603,7 +632,7 @@ function getItemForPlan( plan, properties ) { * @param {Object} cart - cart as `CartValue` object * @returns {Object} the corresponding item in the shopping cart as `CartItemValue` object */ -function findFreeTrial( cart ) { +export function findFreeTrial( cart ) { return find( getAll( cart ), { free_trial: true } ); } @@ -613,7 +642,7 @@ function findFreeTrial( cart ) { * @param {Object} cart - cart as `CartValue` object * @returns {Object[]} the list of the corresponding items in the shopping cart as `CartItemValue` objects */ -function getDomainRegistrations( cart ) { +export function getDomainRegistrations( cart ) { return filter( getAll( cart ), { is_domain_registration: true } ); } @@ -623,7 +652,7 @@ function getDomainRegistrations( cart ) { * @param {Object} cart - cart as `CartValue` object * @returns {Object[]} the list of the corresponding items in the shopping cart as `CartItemValue` objects */ -function getDomainMappings( cart ) { +export function getDomainMappings( cart ) { return filter( getAll( cart ), { product_slug: 'domain_map' } ); } @@ -634,7 +663,7 @@ function getDomainMappings( cart ) { * @param {Object} [properties] - properties to be included in the new CartItem object * @returns {Object} a CartItem object */ -function getRenewalItemFromProduct( product, properties ) { +export function getRenewalItemFromProduct( product, properties ) { product = formatProduct( product ); let cartItem; @@ -693,7 +722,7 @@ function getRenewalItemFromProduct( product, properties ) { * @param {Object} properties - properties to be included in the new CartItem object * @returns {Object} a CartItem object */ -function getRenewalItemFromCartItem( cartItem, properties ) { +export function getRenewalItemFromCartItem( cartItem, properties ) { return merge( {}, cartItem, { extra: { purchaseId: properties.id, @@ -710,11 +739,11 @@ function getRenewalItemFromCartItem( cartItem, properties ) { * @param {Object} cart - cart as `CartValue` object * @returns {Object[]} the list of the corresponding items in the shopping cart as `CartItemValue` objects */ -function getSiteRedirects( cart ) { +export function getSiteRedirects( cart ) { return filter( getAll( cart ), { product_slug: 'offsite_redirect' } ); } -function hasDomainInCart( cart, domain ) { +export function hasDomainInCart( cart, domain ) { return some( getAll( cart ), { is_domain_registration: true, meta: domain } ); } @@ -725,7 +754,7 @@ function hasDomainInCart( cart, domain ) { * @param {Object} cart - cart as `CartValue` object * @returns {Object[]} the list of the corresponding items in the shopping cart as `CartItemValue` objects */ -function getDomainRegistrationsWithoutPrivacy( cart ) { +export function getDomainRegistrationsWithoutPrivacy( cart ) { return getDomainRegistrations( cart ).filter( function( cartItem ) { return ! some( cart.products, { meta: cartItem.meta, @@ -742,7 +771,7 @@ function getDomainRegistrationsWithoutPrivacy( cart ) { * @param {Function} changeFunction - the function that adds/removes the privacy protection to a shopping cart * @returns {Function} the function that adds/removes privacy protections from the shopping cart */ -function changePrivacyForDomains( cart, domainItems, changeFunction ) { +export function changePrivacyForDomains( cart, domainItems, changeFunction ) { return flow.apply( null, domainItems.map( function( item ) { @@ -751,11 +780,11 @@ function changePrivacyForDomains( cart, domainItems, changeFunction ) { ); } -function addPrivacyToAllDomains( cart ) { +export function addPrivacyToAllDomains( cart ) { return changePrivacyForDomains( cart, getDomainRegistrationsWithoutPrivacy( cart ), add ); } -function removePrivacyFromAllDomains( cart ) { +export function removePrivacyFromAllDomains( cart ) { return changePrivacyForDomains( cart, getDomainRegistrations( cart ), remove ); } @@ -765,17 +794,27 @@ function removePrivacyFromAllDomains( cart ) { * @param {Object} cartItem - `CartItemValue` object * @returns {boolean} true if item is a renewal */ -function isRenewal( cartItem ) { +export function isRenewal( cartItem ) { return cartItem.extra && cartItem.extra.purchaseType === 'renewal'; } +/** + * Determines whether a cart item is a transfer + * + * @param {Object} cartItem - `CartItemValue` object + * @returns {boolean} true if item is a renewal + */ +export function isTransfer( cartItem ) { + return cartItem.product_slug === domainProductSlugs.TRANSFER_IN; +} + /** * Determines whether a cart item supports privacy * * @param {Object} cartItem - `CartItemValue` object * @returns {boolean} true if item supports privacy */ -function privacyAvailable( cartItem ) { +export function privacyAvailable( cartItem ) { return get( cartItem, 'extra.privacy_available', true ); } @@ -785,15 +824,15 @@ function privacyAvailable( cartItem ) { * @param {Object} cartItem - `CartItemValue` object * @returns {string} the included domain */ -function getIncludedDomain( cartItem ) { +export function getIncludedDomain( cartItem ) { return cartItem.extra && cartItem.extra.includedDomain; } -function isNextDomainFree( cart ) { +export function isNextDomainFree( cart ) { return !! ( cart && cart.next_domain_is_free ); } -function isDomainBeingUsedForPlan( cart, domain ) { +export function isDomainBeingUsedForPlan( cart, domain ) { if ( cart && domain && hasPlan( cart ) ) { const domainProducts = getDomainRegistrations( cart ).concat( getDomainMappings( cart ) ), domainProduct = domainProducts.shift() || {}; @@ -803,7 +842,12 @@ function isDomainBeingUsedForPlan( cart, domain ) { return false; } -function shouldBundleDomainWithPlan( withPlansOnly, selectedSite, cart, suggestionOrCartItem ) { +export function shouldBundleDomainWithPlan( + withPlansOnly, + selectedSite, + cart, + suggestionOrCartItem +) { return ( withPlansOnly && // not free or a cart item @@ -818,7 +862,7 @@ function shouldBundleDomainWithPlan( withPlansOnly, selectedSite, cart, suggesti ); // site has a plan } -function getDomainPriceRule( withPlansOnly, selectedSite, cart, suggestion ) { +export function getDomainPriceRule( withPlansOnly, selectedSite, cart, suggestion ) { if ( ! suggestion.product_slug || suggestion.cost === 'Free' ) { return 'FREE_DOMAIN'; } @@ -844,7 +888,7 @@ function getDomainPriceRule( withPlansOnly, selectedSite, cart, suggestion ) { * @param {Object} cart - cart as `CartValue` object * @returns {boolean} true if there is at least one cart item added more than X time ago, false otherwise */ -function hasStaleItem( cart ) { +export function hasStaleItem( cart ) { return some( getAll( cart ), function( cartItem ) { // time_added_to_cart is in seconds, Date.now() returns milliseconds return ( @@ -863,6 +907,7 @@ export default { domainPrivacyProtection, domainRedemption, domainRegistration, + domainTransfer, fillGoogleAppsRegistrationData, findFreeTrial, getAll, @@ -872,6 +917,7 @@ export default { getDomainRegistrations, getDomainRegistrationsWithoutPrivacy, getDomainRegistrationTld, + getDomainTransfers, getIncludedDomain, getItemForPlan, getRenewalItemFromCartItem, @@ -882,8 +928,9 @@ export default { googleApps, googleAppsExtraLicenses, guidedTransferItem, - isNextDomainFree, isDomainBeingUsedForPlan, + isNextDomainFree, + isTransfer, hasDomainCredit, hasDomainInCart, hasDomainMapping, @@ -914,4 +961,5 @@ export default { unlimitedThemesItem, videoPressItem, hasStaleItem, + hasTransferProduct, }; diff --git a/client/lib/cart-values/index.js b/client/lib/cart-values/index.js index f0fd9fa5a21aa..a88f8c5dd073f 100644 --- a/client/lib/cart-values/index.js +++ b/client/lib/cart-values/index.js @@ -144,6 +144,8 @@ function isPaymentMethodEnabled( cart, method ) { return isCreditCardPaymentsEnabled( cart ); case 'paypal': return isPayPalExpressEnabled( cart ); + case 'ideal': + return isNetherlandsIdealEnabled( cart ); default: return false; } @@ -160,6 +162,14 @@ function isPayPalExpressEnabled( cart ) { ); } +function isNetherlandsIdealEnabled( cart ) { + return ( + config.isEnabled( 'upgrades/netherlands-ideal' ) && + cart.allowed_payment_methods.indexOf( 'WPCOM_Billing_Stripe_Source_Ideal' ) >= 0 && + 'EUR' === cart.currency + ); +} + export default { applyCoupon, canRemoveFromCart, @@ -173,5 +183,6 @@ export default { isPaidForFullyInCredits, isPaymentMethodEnabled, isPayPalExpressEnabled, + isNetherlandsIdealEnabled, isCreditCardPaymentsEnabled, }; diff --git a/client/lib/domains/assembler.js b/client/lib/domains/assembler.js index f7cb1da24a14f..720fd958780ff 100644 --- a/client/lib/domains/assembler.js +++ b/client/lib/domains/assembler.js @@ -10,7 +10,7 @@ import i18n from 'i18n-calypso'; /** * Internal dependencies */ -import { getDomainType } from './utils'; +import { getDomainType, getTransferStatus } from './utils'; function createDomainObjects( dataTransferObject ) { let domains = []; @@ -46,6 +46,7 @@ function createDomainObjects( dataTransferObject ) { subscriptionId: domain.subscription_id, transferLockOnWhoisUpdateOptional: domain.transfer_lock_on_whois_update_optional, type: getDomainType( domain ), + transferStatus: getTransferStatus( domain ), whoisUpdateUnmodifiableFields: domain.whois_update_unmodifiable_fields, }; } ); diff --git a/client/lib/domains/constants.js b/client/lib/domains/constants.js index 447616f64b756..b70ee9eb00497 100644 --- a/client/lib/domains/constants.js +++ b/client/lib/domains/constants.js @@ -11,6 +11,14 @@ const type = keyMirror( { REGISTERED: null, SITE_REDIRECT: null, WPCOM: null, + TRANSFER: null, +} ); + +const transferStatus = keyMirror( { + PENDING_OWNER: null, + PENDING_REGISTRY: null, + CANCELLED: null, + COMPLETED: null, } ); const registrar = { @@ -53,9 +61,15 @@ const dnsTemplates = { }, }; +const domainProductSlugs = { + TRANSFER_IN: 'domain_transfer', +}; + export default { dnsTemplates, domainAvailability, + domainProductSlugs, registrar, + transferStatus, type, }; diff --git a/client/lib/domains/index.js b/client/lib/domains/index.js index a9da97f2e6304..967d7b7afcfc3 100644 --- a/client/lib/domains/index.js +++ b/client/lib/domains/index.js @@ -50,6 +50,22 @@ function checkDomainAvailability( domainName, onComplete ) { } ); } +function checkInboundTransferStatus( domainName, onComplete ) { + if ( ! domainName ) { + onComplete( null ); + return; + } + + wpcom.undocumented().getInboundTransferStatus( domainName, function( serverError, result ) { + if ( serverError ) { + onComplete( serverError.error ); + return; + } + + onComplete( null, result ); + } ); +} + function canRedirect( siteId, domainName, onComplete ) { if ( ! domainName ) { onComplete( new ValidationError( 'empty_query' ) ); @@ -177,6 +193,7 @@ export { canAddGoogleApps, canRedirect, checkDomainAvailability, + checkInboundTransferStatus, getFixedDomainSearch, getGoogleAppsSupportedDomains, getPrimaryDomain, diff --git a/client/lib/domains/test/assembler.js b/client/lib/domains/test/assembler.js index 3d696ccacd747..300552330e17d 100644 --- a/client/lib/domains/test/assembler.js +++ b/client/lib/domains/test/assembler.js @@ -55,8 +55,9 @@ describe( 'assembler', () => { registrar: undefined, registrationMoment: undefined, subscriptionId: undefined, - type: domainTypes.SITE_REDIRECT, transferLockOnWhoisUpdateOptional: undefined, + transferStatus: null, + type: domainTypes.SITE_REDIRECT, whoisUpdateUnmodifiableFields: undefined, hasZone: undefined, pointsToWpcom: undefined, diff --git a/client/lib/domains/utils.js b/client/lib/domains/utils.js index f5f2386b84dd2..a9f2d342e651e 100644 --- a/client/lib/domains/utils.js +++ b/client/lib/domains/utils.js @@ -8,7 +8,7 @@ import { drop, isEmpty, join, find, split, values } from 'lodash'; /** * Internal dependencies */ -import { type as domainTypes } from './constants'; +import { type as domainTypes, transferStatus } from './constants'; import { cartItems } from 'lib/cart-values'; import { isDomainRegistration } from 'lib/products-values'; @@ -17,6 +17,10 @@ function getDomainType( domainFromApi ) { return domainTypes.SITE_REDIRECT; } + if ( domainFromApi.type === 'transfer' ) { + return domainTypes.TRANSFER; + } + if ( domainFromApi.wpcom_domain ) { return domainTypes.WPCOM; } @@ -28,6 +32,26 @@ function getDomainType( domainFromApi ) { return domainTypes.MAPPED; } +function getTransferStatus( domainFromApi ) { + if ( domainFromApi.transfer_status === 'pending_owner' ) { + return transferStatus.PENDING_OWNER; + } + + if ( domainFromApi.transfer_status === 'pending_registry' ) { + return transferStatus.PENDING_REGISTRY; + } + + if ( domainFromApi.transfer_status === 'cancelled' ) { + return transferStatus.CANCELLED; + } + + if ( domainFromApi.transfer_status === 'completed' ) { + return transferStatus.COMPLETED; + } + + return null; +} + /** * Depending on the current step in checkout, the user's domain can be found in * either the cart or the receipt. @@ -70,4 +94,9 @@ function parseDomainAgainstTldList( domainFragment, tldList ) { return parseDomainAgainstTldList( suffix, tldList ); } -export { getDomainNameFromReceiptOrCart, getDomainType, parseDomainAgainstTldList }; +export { + getDomainNameFromReceiptOrCart, + getDomainType, + getTransferStatus, + parseDomainAgainstTldList, +}; diff --git a/client/lib/happychat/README.md b/client/lib/happychat/README.md new file mode 100644 index 0000000000000..31d21b67dfb0a --- /dev/null +++ b/client/lib/happychat/README.md @@ -0,0 +1,71 @@ +# SocketIO API + +The SocketIO API models the SocketIO event flow purely as Redux actions. By making the SocketIO API Redux-driven, we have several advantages: + +* the API surface is minimal and simpler to reason about: the Redux action becomes the single point of truth, no need to modify anything else. +* testability and real-time inspection of the system behavior is a matter of taking a look at the Redux flow and state. + +## API + +The connection has the following methods: + +* `init( ... )`: configure the connection. +* `send( action )`: receives a send Redux action and emits the corresponding SocketIO event. +* `request( action, timeout )`: receives a request Redux action and emits the corresponding SocketIO event. Unlike send, the event fired takes a callback to be called upon ACK, or a timeout callback to be called if the event didn't respond after timeout milliseconds. + +### Inbound SocketIO events + +Every inbound SocketIO event dispatches its own Redux action, which is namespaced with the `HAPPYCHAT_IO_RECEIVE_EVENTNAME` type. Its action creator name convention is `receiveEventname`. + +For example: + +- the `init` SocketIO event dispatches the `receiveInit` action whose type is `HAPPYCHAT_IO_RECEIVE_INIT`. +- the `message` SocketIO event dispatches the `receiveMessage` action whose type is `HAPPYCHAT_IO_RECEIVE_MESSAGE`. + +See `client/state/happychat/connection/actions.js` for a complete list of actions. + +### Outbound SocketIO events + +Every outbound SocketIO event has a corresponding Redux action. The middleware binds the Redux action with the proper connection method. The Redux actions types are namespaced with the `HAPPYCHAT_IO_SEND_EVENTNAME` or `HAPPYCHAT_IO_REQUEST_EVENTNAME` and the corresponding action creators are named after the connection method they use and its event name. + +See `client/state/happychat/connection/actions.js` for a complete list of actions. + +#### INIT action + +The `init` action uses the `connection.init` method. Its action creator is called `initConnection` and the action shape is: + +``` +{ + type: HAPPYCHAT_IO_INIT, + auth // promise that holds the Authentication mechanism +} +``` + +#### SEND actions + +Any `send` action uses the `connection.send` method. Its action creator name convention is `sendEventname` and the action shape: + +``` +{ + type: HAPPYCHAT_IO_SEND_EVENTNAME, + event: 'eventname' + payload: ... // contents to be sent, can be anything: object, string, etc +} +``` + +Note that, at the moment of writing, we are using the `message` event to send different kind of messages: user messages, regular events, log events, and user info. These actions were shortened to convey a better API to upper layers without leaking underlying details, so the actions are named `sendMessage`, `sendEvent`, `sendLog` `sendUserInfo` instead of `sendMessageMessage`, `sendMessageEvent`, etc. + +#### REQUEST actions + +Any `request` action uses the `connection.request` method. Its creator name convention is `requestEventname` and the action shape: + +``` +{ + type: HAPPYCHAT_IO_REQUEST_EVENTNAME, + event: 'eventname', + payload: ... // contents to be sent, can be anything: object, string, etc + timeout: timeout, + callback: receiveTranscript, + callbackTimeout: receiveTranscriptTimeout, +} +``` diff --git a/client/lib/happychat/connection-ng.js b/client/lib/happychat/connection-ng.js new file mode 100644 index 0000000000000..e205fbf6e18fa --- /dev/null +++ b/client/lib/happychat/connection-ng.js @@ -0,0 +1,172 @@ +/** @format */ + +/** + * External dependencies + */ +import IO from 'socket.io-client'; +import { isString } from 'lodash'; + +/** + * Internal dependencies + */ +import { + receiveAccept, + receiveConnect, + receiveDisconnect, + receiveError, + receiveInit, + receiveMessage, + receiveReconnecting, + receiveStatus, + receiveToken, + receiveUnauthorized, + requestTranscript, +} from 'state/happychat/connection/actions'; + +const debug = require( 'debug' )( 'calypso:happychat:connection' ); + +const buildConnection = socket => + isString( socket ) + ? new IO( socket ) // If socket is an URL, connect to server. + : socket; // If socket is not an url, use it directly. Useful for testing. + +class Connection { + /** + * Init the SockeIO connection: check user authorization and bind socket events + * + * @param { Function } dispatch Redux dispatch function + * @param { Promise } auth Authentication promise, will return the user info upon fulfillment + * @return { Promise } Fulfilled (returns the opened socket) + * or rejected (returns an error message) + */ + init( dispatch, auth ) { + if ( this.openSocket ) { + debug( 'socket is already connected' ); + return this.openSocket; + } + this.dispatch = dispatch; + + this.openSocket = new Promise( ( resolve, reject ) => { + auth + .then( ( { url, user: { signer_user_id, jwt, locale, groups, geoLocation } } ) => { + const socket = buildConnection( url ); + socket + .once( 'connect', () => dispatch( receiveConnect() ) ) + .on( 'token', handler => { + dispatch( receiveToken() ); + handler( { signer_user_id, jwt, locale, groups } ); + } ) + .on( 'init', () => { + dispatch( receiveInit( { signer_user_id, locale, groups, geoLocation } ) ); + dispatch( requestTranscript() ); + resolve( socket ); + } ) + .on( 'unauthorized', () => { + socket.close(); + dispatch( receiveUnauthorized( 'User is not authorized' ) ); + reject( 'User is not authorized' ); + } ) + .on( 'disconnect', reason => dispatch( receiveDisconnect( reason ) ) ) + .on( 'reconnecting', () => dispatch( receiveReconnecting() ) ) + .on( 'status', status => dispatch( receiveStatus( status ) ) ) + .on( 'accept', accept => dispatch( receiveAccept( accept ) ) ) + .on( 'message', message => dispatch( receiveMessage( message ) ) ); + } ) + .catch( e => reject( e ) ); + } ); + + return this.openSocket; + } + + /** + * Given a Redux action, emits a SocketIO event. + * + * @param { Object } action A Redux action with props + * { + * event: SocketIO event name, + * payload: contents to be sent, + * error: message to be shown should the event fails to be sent, + * } + * @return { Promise } Fulfilled (returns nothing) + * or rejected (returns an error message) + */ + send( action ) { + if ( ! this.openSocket ) { + return; + } + return this.openSocket.then( + socket => socket.emit( action.event, action.payload ), + e => { + this.dispatch( receiveError( 'failed to send ' + action.event + ': ' + e ) ); + // so we can relay the error message, for testing purposes + return Promise.reject( e ); + } + ); + } + + /** + * + * Given a Redux action and a timeout, emits a SocketIO event that request + * some info to the Happychat server. + * + * The request can have three states, and will dispatch an action accordingly: + * + * - request was succesful: would dispatch action.callback + * - request was unsucessful: would dispatch receiveError + * - request timeout: would dispatch action.callbackTimeout + * + * @param { Object } action A Redux action with props + * { + * event: SocketIO event name, + * payload: contents to be sent, + * callback: a Redux action creator, + * callbackTimeout: a Redux action creator, + * } + * @param { Number } timeout How long (in milliseconds) has the server to respond + * @return { Promise } Fulfilled (returns the transcript response) + * or rejected (returns an error message) + */ + request( action, timeout ) { + if ( ! this.openSocket ) { + return; + } + + return this.openSocket.then( + socket => { + const promiseRace = Promise.race( [ + new Promise( ( resolve, reject ) => { + socket.emit( action.event, action.payload, ( e, result ) => { + if ( e ) { + return reject( new Error( e ) ); // request successful + } + return resolve( result ); // request failed + } ); + } ), + new Promise( ( resolve, reject ) => + setTimeout( () => { + return reject( Error( 'timeout' ) ); // request timeout + }, timeout ) + ), + ] ); + + // dispatch the request state upon promise race resolution + promiseRace.then( + result => this.dispatch( action.callback( result ) ), + e => + e.message === 'timeout' + ? this.dispatch( action.callbackTimeout() ) + : this.dispatch( receiveError( action.event + ' request failed: ' + e.message ) ) + ); + + return promiseRace; + }, + e => { + this.dispatch( receiveError( 'failed to send ' + action.event + ': ' + e ) ); + // so we can relay the error message, for testing purposes + return Promise.reject( e ); + } + ); + } +} + +export default () => new Connection(); diff --git a/client/lib/happychat/connection.js b/client/lib/happychat/connection.js index 9d59264bd09a2..d7e559213d307 100644 --- a/client/lib/happychat/connection.js +++ b/client/lib/happychat/connection.js @@ -1,27 +1,27 @@ +/** @format */ + /** * External dependencies - * - * @format */ - import IO from 'socket.io-client'; -import { v4 as uuid } from 'uuid'; import { isString } from 'lodash'; /** * Internal dependencies */ -import { HAPPYCHAT_MESSAGE_TYPES } from 'state/happychat/constants'; import { - receiveChatEvent, - requestChatTranscript, - setConnected, - setConnecting, - setDisconnected, - setHappychatAvailable, - setReconnecting, + receiveAccept, + receiveConnect, + receiveDisconnect, + receiveError, + receiveInit, + receiveMessage, + receiveReconnecting, + receiveStatus, + receiveToken, + receiveUnauthorized, + requestTranscript, } from 'state/happychat/connection/actions'; -import { setHappychatChatStatus } from 'state/happychat/chat/actions'; const debug = require( 'debug' )( 'calypso:happychat:connection' ); @@ -31,132 +31,141 @@ const buildConnection = socket => : socket; // If socket is not an url, use it directly. Useful for testing. class Connection { - init( url, dispatch, { signer_user_id, jwt, locale, groups, geoLocation } ) { + /** + * Init the SockeIO connection: check user authorization and bind socket events + * + * @param { Function } dispatch Redux dispatch function + * @param { Promise } auth Authentication promise, will return the user info upon fulfillment + * @return { Promise } Fulfilled (returns the opened socket) + * or rejected (returns an error message) + */ + init( dispatch, auth ) { if ( this.openSocket ) { debug( 'socket is already connected' ); return this.openSocket; } + this.dispatch = dispatch; - dispatch( setConnecting() ); - - const socket = buildConnection( url ); this.openSocket = new Promise( ( resolve, reject ) => { - socket - .once( 'connect', () => debug( 'connected' ) ) - .on( 'token', handler => handler( { signer_user_id, jwt, locale, groups } ) ) - .on( 'init', () => { - dispatch( setConnected( { signer_user_id, locale, groups, geoLocation } ) ); - // TODO: There's no need to dispatch a separate action to request a transcript. - // The HAPPYCHAT_CONNECTED action should have its own middleware handler that does this. - dispatch( requestChatTranscript() ); - resolve( socket ); - } ) - .on( 'unauthorized', () => { - socket.close(); - reject( 'user is not authorized' ); + auth + .then( ( { url, user: { signer_user_id, jwt, locale, groups, geoLocation } } ) => { + const socket = buildConnection( url ); + + socket + .once( 'connect', () => dispatch( receiveConnect() ) ) + .on( 'token', handler => { + dispatch( receiveToken() ); + handler( { signer_user_id, jwt, locale, groups } ); + } ) + .on( 'init', () => { + dispatch( receiveInit( { signer_user_id, locale, groups, geoLocation } ) ); + dispatch( requestTranscript() ); + resolve( socket ); + } ) + .on( 'unauthorized', () => { + socket.close(); + dispatch( receiveUnauthorized( 'User is not authorized' ) ); + reject( 'user is not authorized' ); + } ) + .on( 'disconnect', reason => dispatch( receiveDisconnect( reason ) ) ) + .on( 'reconnecting', () => dispatch( receiveReconnecting() ) ) + .on( 'status', status => dispatch( receiveStatus( status ) ) ) + .on( 'accept', accept => dispatch( receiveAccept( accept ) ) ) + .on( 'message', message => dispatch( receiveMessage( message ) ) ); } ) - .on( 'disconnect', reason => dispatch( setDisconnected( reason ) ) ) - .on( 'reconnecting', () => dispatch( setReconnecting() ) ) - .on( 'status', status => dispatch( setHappychatChatStatus( status ) ) ) - .on( 'accept', accept => dispatch( setHappychatAvailable( accept ) ) ) - .on( 'message', message => dispatch( receiveChatEvent( message ) ) ); + .catch( e => reject( e ) ); } ); return this.openSocket; } - typing( message ) { - this.openSocket.then( - socket => socket.emit( 'typing', { message } ), - e => debug( 'failed to send typing', e ) - ); - } - - notTyping() { - this.openSocket.then( - socket => socket.emit( 'typing', false ), - e => debug( 'failed to send typing', e ) - ); - } - - send( message, meta = {} ) { - this.openSocket.then( - socket => socket.emit( 'message', { text: message, id: uuid(), meta } ), - e => debug( 'failed to send message', e ) - ); - } - - sendEvent( message ) { - this.openSocket.then( - socket => - socket.emit( 'message', { - text: message, - id: uuid(), - type: HAPPYCHAT_MESSAGE_TYPES.CUSTOMER_EVENT, - meta: { forOperator: true, event_type: HAPPYCHAT_MESSAGE_TYPES.CUSTOMER_EVENT }, - } ), - e => debug( 'failed to send message', e ) - ); - } - /** - * Update chat preferences (locale and groups) - * @param {string} locale representing the user selected locale - * @param {array} groups of string happychat groups (wp.com, jpop) based on the site selected + * Given a Redux action, emits a SocketIO event. + * + * @param { Object } action A Redux action with props + * { + * event: SocketIO event name, + * payload: contents to be sent, + * error: message to be shown should the event fails to be sent, + * } + * @return { Promise } Fulfilled (returns nothing) + * or rejected (returns an error message) */ - setPreferences( locale, groups ) { - this.openSocket.then( - socket => socket.emit( 'preferences', { locale, groups } ), - e => debug( 'failed to send preferences', e ) - ); - } - - sendLog( message ) { - this.openSocket.then( - socket => - socket.emit( 'message', { - text: message, - id: uuid(), - type: HAPPYCHAT_MESSAGE_TYPES.LOG, - meta: { forOperator: true, event_type: HAPPYCHAT_MESSAGE_TYPES.LOG }, - } ), - e => debug( 'failed to send message', e ) + send( action ) { + if ( ! this.openSocket ) { + return; + } + return this.openSocket.then( + socket => socket.emit( action.event, action.payload ), + e => { + this.dispatch( receiveError( 'failed to send ' + action.event + ': ' + e ) ); + // so we can relay the error message, for testing purposes + return Promise.reject( e ); + } ); } /** - * Send customer and browser information - * @param { Object } info selected form fields, customer date time, user agent and browser info + * + * Given a Redux action and a timeout, emits a SocketIO event that request + * some info to the Happychat server. + * + * The request can have three states, and will dispatch an action accordingly: + * + * - request was succesful: would dispatch action.callback + * - request was unsucessful: would dispatch receiveError + * - request timeout: would dispatch action.callbackTimeout + * + * @param { Object } action A Redux action with props + * { + * event: SocketIO event name, + * payload: contents to be sent, + * callback: a Redux action creator, + * callbackTimeout: a Redux action creator, + * } + * @param { Number } timeout How long (in milliseconds) has the server to respond + * @return { Promise } Fulfilled (returns the transcript response) + * or rejected (returns an error message) */ - sendInfo( info ) { - this.openSocket.then( - socket => - socket.emit( 'message', { - id: uuid(), - meta: { ...info, forOperator: true }, - type: HAPPYCHAT_MESSAGE_TYPES.CUSTOMER_INFO, - } ), - e => debug( 'failed to send message', e ) - ); - } + request( action, timeout ) { + if ( ! this.openSocket ) { + return; + } - transcript( timestamp ) { - return this.openSocket.then( socket => - Promise.race( [ - new Promise( ( resolve, reject ) => { - socket.emit( 'transcript', timestamp || null, ( e, result ) => { - if ( e ) { - return reject( new Error( e ) ); - } - resolve( result ); - } ); - } ), - new Promise( ( resolve, reject ) => - setTimeout( () => { - reject( Error( 'timeout' ) ); - }, 10000 ) - ), - ] ) + return this.openSocket.then( + socket => { + const promiseRace = Promise.race( [ + new Promise( ( resolve, reject ) => { + socket.emit( action.event, action.payload, ( e, result ) => { + if ( e ) { + return reject( new Error( e ) ); // request failed + } + return resolve( result ); // request succesful + } ); + } ), + new Promise( ( resolve, reject ) => + setTimeout( () => { + return reject( new Error( 'timeout' ) ); // request timeout + }, timeout ) + ), + ] ); + + // dispatch the request state upon promise race resolution + promiseRace.then( + result => this.dispatch( action.callback( result ) ), + e => + e.message === 'timeout' + ? this.dispatch( action.callbackTimeout() ) + : this.dispatch( receiveError( action.event + ' request failed: ' + e.message ) ) + ); + + return promiseRace; + }, + e => { + this.dispatch( receiveError( 'failed to send ' + action.event + ': ' + e ) ); + // so we can relay the error message, for testing purposes + return Promise.reject( e ); + } ); } } diff --git a/client/lib/happychat/test/index.js b/client/lib/happychat/test/index.js index 5a8a8507c499c..3cfffcf717baa 100644 --- a/client/lib/happychat/test/index.js +++ b/client/lib/happychat/test/index.js @@ -1,157 +1,327 @@ /** @format */ + /** * External dependencies */ -import { expect } from 'chai'; -import { stub } from 'sinon'; import { EventEmitter } from 'events'; /** * Internal dependencies */ import { - HAPPYCHAT_CONNECTING, - HAPPYCHAT_CONNECTED, - HAPPYCHAT_DISCONNECTED, - HAPPYCHAT_RECEIVE_EVENT, - HAPPYCHAT_RECONNECTING, - HAPPYCHAT_SET_AVAILABLE, - HAPPYCHAT_SET_CHAT_STATUS, - HAPPYCHAT_TRANSCRIPT_REQUEST, -} from 'state/action-types'; - + receiveAccept, + receiveConnect, + receiveDisconnect, + receiveError, + receiveInit, + receiveMessage, + receiveReconnecting, + receiveStatus, + receiveToken, + receiveTranscript, + receiveTranscriptTimeout, + receiveUnauthorized, + requestTranscript, + sendTyping, +} from 'state/happychat/connection/actions'; import buildConnection from '../connection'; describe( 'connection', () => { - describe( 'should bind socket ', () => { + describe( 'init', () => { + describe( 'should bind SockeIO events upon config promise resolution', () => { + const signer_user_id = 12; + const jwt = 'jwt'; + const locale = 'locale'; + const groups = 'groups'; + const geoLocation = 'location'; + + let socket, dispatch, openSocket; + beforeEach( () => { + socket = new EventEmitter(); + dispatch = jest.fn(); + const connection = buildConnection(); + const config = Promise.resolve( { + url: socket, + user: { + signer_user_id, + jwt, + locale, + groups, + geoLocation, + }, + } ); + openSocket = connection.init( dispatch, config ); + } ); + + test( 'connect event', () => { + socket.emit( 'connect' ); + expect( dispatch ).toHaveBeenCalledTimes( 1 ); + expect( dispatch ).toHaveBeenCalledWith( receiveConnect() ); + } ); + + test( 'token event', () => { + const callback = jest.fn(); + socket.emit( 'token', callback ); + expect( dispatch ).toHaveBeenCalledTimes( 1 ); + expect( dispatch ).toHaveBeenCalledWith( receiveToken() ); + expect( callback ).toHaveBeenCalledTimes( 1 ); + expect( callback ).toHaveBeenCalledWith( { signer_user_id, jwt, locale, groups } ); + } ); + + test( 'init event', () => { + socket.emit( 'init' ); + expect( dispatch ).toHaveBeenCalledTimes( 2 ); + expect( dispatch.mock.calls[ 0 ][ 0 ] ).toEqual( + receiveInit( { signer_user_id, locale, groups, geoLocation } ) + ); + expect( dispatch.mock.calls[ 1 ][ 0 ] ).toEqual( requestTranscript() ); + return expect( openSocket ).resolves.toBe( socket ); + } ); + + test( 'unauthorized event', () => { + socket.close = jest.fn(); + openSocket.catch( () => { + expect( dispatch ).toHaveBeenCalledTimes( 1 ); + expect( dispatch ).toHaveBeenCalledWith( + receiveUnauthorized( 'User is not authorized' ) + ); + expect( socket.close ).toHaveBeenCalled(); + } ); + socket.emit( 'unauthorized' ); + } ); + + test( 'disconnect event', () => { + const error = 'testing reasons'; + socket.emit( 'disconnect', error ); + expect( dispatch ).toHaveBeenCalledTimes( 1 ); + expect( dispatch ).toHaveBeenCalledWith( receiveDisconnect( error ) ); + } ); + + test( 'reconnecting event', () => { + socket.emit( 'reconnecting' ); + expect( dispatch ).toHaveBeenCalledTimes( 1 ); + expect( dispatch ).toHaveBeenCalledWith( receiveReconnecting() ); + } ); + + test( 'status event', () => { + const status = 'testing status'; + socket.emit( 'status', status ); + expect( dispatch ).toHaveBeenCalledTimes( 1 ); + expect( dispatch ).toHaveBeenCalledWith( receiveStatus( status ) ); + } ); + + test( 'accept event', () => { + const isAvailable = true; + socket.emit( 'accept', isAvailable ); + expect( dispatch ).toHaveBeenCalledTimes( 1 ); + expect( dispatch ).toHaveBeenCalledWith( receiveAccept( isAvailable ) ); + } ); + + test( 'message event', () => { + const message = 'testing msg'; + socket.emit( 'message', message ); + expect( dispatch ).toHaveBeenCalledTimes( 1 ); + expect( dispatch ).toHaveBeenCalledWith( receiveMessage( message ) ); + } ); + } ); + + describe( 'should not bind SocketIO events upon config promise rejection', () => { + let connection, socket, dispatch, openSocket; + const rejectMsg = 'no auth'; + beforeEach( () => { + socket = new EventEmitter(); + dispatch = jest.fn(); + connection = buildConnection(); + openSocket = connection.init( dispatch, Promise.reject( rejectMsg ) ); + } ); + + test( 'openSocket Promise has been rejected', () => { + return expect( openSocket ).rejects.toBe( rejectMsg ); + } ); + + test( 'connect event', () => { + socket.emit( 'connect' ); + expect( dispatch ).toHaveBeenCalledTimes( 0 ); + // catch the promise to avoid the UnhandledPromiseRejectionWarning + return expect( openSocket ).rejects.toBe( rejectMsg ); + } ); + + test( 'token event', () => { + const callback = jest.fn(); + socket.emit( 'token', callback ); + expect( dispatch ).toHaveBeenCalledTimes( 0 ); + expect( callback ).toHaveBeenCalledTimes( 0 ); + // catch the promise to avoid the UnhandledPromiseRejectionWarning + return expect( openSocket ).rejects.toBe( rejectMsg ); + } ); + + test( 'init event', () => { + socket.emit( 'init' ); + expect( dispatch ).toHaveBeenCalledTimes( 0 ); + // catch the promise to avoid the UnhandledPromiseRejectionWarning + return expect( openSocket ).rejects.toBe( rejectMsg ); + } ); + + test( 'unauthorized event', () => { + socket.close = jest.fn(); + socket.emit( 'unauthorized' ); + expect( dispatch ).toHaveBeenCalledTimes( 0 ); + // catch the promise to avoid the UnhandledPromiseRejectionWarning + return expect( openSocket ).rejects.toBe( rejectMsg ); + } ); + + test( 'disconnect event', () => { + const error = 'testing reasons'; + socket.emit( 'disconnect', error ); + expect( dispatch ).toHaveBeenCalledTimes( 0 ); + // catch the promise to avoid the UnhandledPromiseRejectionWarning + return expect( openSocket ).rejects.toBe( rejectMsg ); + } ); + + test( 'reconnecting event', () => { + socket.emit( 'reconnecting' ); + expect( dispatch ).toHaveBeenCalledTimes( 0 ); + // catch the promise to avoid the UnhandledPromiseRejectionWarning + return expect( openSocket ).rejects.toBe( rejectMsg ); + } ); + + test( 'status event', () => { + const status = 'testing status'; + socket.emit( 'status', status ); + expect( dispatch ).toHaveBeenCalledTimes( 0 ); + // catch the promise to avoid the UnhandledPromiseRejectionWarning + return expect( openSocket ).rejects.toBe( rejectMsg ); + } ); + + test( 'accept event', () => { + const isAvailable = true; + socket.emit( 'accept', isAvailable ); + expect( dispatch ).toHaveBeenCalledTimes( 0 ); + // catch the promise to avoid the UnhandledPromiseRejectionWarning + return expect( openSocket ).rejects.toBe( rejectMsg ); + } ); + + test( 'message event', () => { + const message = 'testing msg'; + socket.emit( 'message', message ); + expect( dispatch ).toHaveBeenCalledTimes( 0 ); + // catch the promise to avoid the UnhandledPromiseRejectionWarning + return expect( openSocket ).rejects.toBe( rejectMsg ); + } ); + } ); + } ); + + describe( 'when auth promise chain is fulfilled', () => { const signer_user_id = 12; const jwt = 'jwt'; const locale = 'locale'; const groups = 'groups'; const geoLocation = 'location'; - let openSocket, socket, dispatch; + let socket, dispatch, connection, config; beforeEach( () => { socket = new EventEmitter(); - dispatch = stub(); - const connection = buildConnection(); - openSocket = connection.init( socket, dispatch, { - signer_user_id, - jwt, - locale, - groups, - geoLocation, + dispatch = jest.fn(); + connection = buildConnection(); + config = Promise.resolve( { + url: socket, + user: { + signer_user_id, + jwt, + locale, + groups, + geoLocation, + }, } ); + connection.init( dispatch, config ); } ); - it( 'connect event', done => { - openSocket.then( () => { - // TODO: implement when connect event is used - expect( true ).to.equal( true ); - done(); // tell mocha the promise chain ended - } ); - socket.emit( 'connect' ); - socket.emit( 'init' ); // force openSocket promise to resolve - } ); + test( 'connection.send should emit a SocketIO event', () => { + socket.emit( 'init' ); // resolve internal openSocket promise - it( 'token event', done => { - const callback = stub(); - openSocket.then( () => { - expect( callback ).to.have.been.calledWithMatch( { signer_user_id, jwt, locale, groups } ); - done(); // tell mocha the promise chain ended + socket.emit = jest.fn(); + const action = sendTyping( 'my msg' ); + return connection.send( action ).then( () => { + expect( socket.emit ).toHaveBeenCalledWith( action.event, action.payload ); } ); - socket.emit( 'token', callback ); - socket.emit( 'init' ); // force openSocket promise to resolve } ); - it( 'init event', done => { - openSocket.then( () => { - expect( dispatch.getCall( 0 ) ).to.have.been.calledWithMatch( { - type: HAPPYCHAT_CONNECTING, - } ); - expect( dispatch.getCall( 1 ) ).to.have.been.calledWithMatch( { - type: HAPPYCHAT_CONNECTED, - user: { signer_user_id, locale, groups, geoLocation }, - } ); - expect( dispatch.getCall( 2 ) ).to.have.been.calledWithMatch( { - type: HAPPYCHAT_TRANSCRIPT_REQUEST, + describe( 'connection.request should emit a SocketIO event', () => { + test( 'and dispatch callbackTimeout if request ran out of time', () => { + socket.emit( 'init' ); // resolve internal openSocket promise + + const action = requestTranscript( null ); + socket.emit = jest.fn(); + return connection.request( action, 100 ).catch( error => { + expect( socket.emit ).toHaveBeenCalled(); + expect( socket.emit.mock.calls[ 0 ][ 0 ] ).toBe( action.event ); + expect( socket.emit.mock.calls[ 0 ][ 1 ] ).toBe( action.payload ); + expect( dispatch ).toHaveBeenCalledWith( receiveTranscriptTimeout() ); + expect( error.message ).toBe( 'timeout' ); } ); - done(); // tell mocha the promise chain ended } ); - socket.emit( 'init' ); // force openSocket promise to resolve - } ); - it( 'unauthorized event', done => { - socket.close = stub().returns( () => {} ); - openSocket.then( () => { - expect( socket.close ).to.have.been.called; - done(); // tell mocha the promise chain ended - } ); - socket.emit( 'init' ); // force openSocket promise to resolve - socket.emit( 'unauthorized' ); - } ); + test( 'and dispatch callback if request responded successfully', () => { + socket.emit( 'init' ); // resolve internal openSocket promise - it( 'disconnect event', done => { - const errorStatus = 'testing reasons'; - openSocket.then( () => { - expect( dispatch.getCall( 3 ) ).to.have.been.calledWithMatch( { - type: HAPPYCHAT_DISCONNECTED, - errorStatus, + const action = requestTranscript( null ); + socket.on( action.event, ( payload, callback ) => { + const result = { + messages: [ 'msg1', 'msg2' ], + timestamp: Date.now(), + }; + callback( null, result ); // fake server responded ok + } ); + return connection.request( action, 100 ).then( result => { + expect( dispatch ).toHaveBeenCalledWith( receiveTranscript( result ) ); } ); - done(); // tell mocha the promise chain ended } ); - socket.emit( 'init' ); // force openSocket promise to resolve - socket.emit( 'disconnect', errorStatus ); - } ); - it( 'reconnecting event', done => { - openSocket.then( () => { - expect( dispatch.getCall( 3 ) ).to.have.been.calledWithMatch( { - type: HAPPYCHAT_RECONNECTING, + test( 'and dispatch error if request was not successful', () => { + socket.emit( 'init' ); // resolve internal openSocket promise + + const action = requestTranscript( null ); + socket.on( action.event, ( payload, callback ) => { + callback( 'no data', null ); // fake server responded with error + } ); + return connection.request( action, 100 ).catch( error => { + expect( error.message ).toBe( 'no data' ); + expect( dispatch ).toHaveBeenCalledWith( + receiveError( action.event + ' request failed: ' + error.message ) + ); } ); - done(); // tell mocha the promise chain ended } ); - socket.emit( 'init' ); // force openSocket promise to resolve - socket.emit( 'reconnecting' ); } ); + } ); - it( 'status event', done => { - const status = 'testing status'; - openSocket.then( () => { - expect( dispatch.getCall( 3 ) ).to.have.been.calledWithMatch( { - type: HAPPYCHAT_SET_CHAT_STATUS, - status, - } ); - done(); // tell mocha the promise chain ended - } ); - socket.emit( 'init' ); // force openSocket promise to resolve - socket.emit( 'status', status ); + describe( 'when auth promise chain is rejected', () => { + let socket, dispatch, connection, config; + beforeEach( () => { + socket = new EventEmitter(); + dispatch = jest.fn(); + connection = buildConnection(); + config = Promise.reject( 'no auth' ); + connection.init( dispatch, config ); } ); - it( 'accept event', done => { - const isAvailable = true; - openSocket.then( () => { - expect( dispatch.getCall( 3 ) ).to.have.been.calledWithMatch( { - type: HAPPYCHAT_SET_AVAILABLE, - isAvailable, - } ); - done(); // tell mocha the promise chain ended + test( 'connection.send should dispatch receiveError action', () => { + socket.emit = jest.fn(); + const action = sendTyping( 'content' ); + return connection.send( action ).catch( e => { + expect( dispatch ).toHaveBeenCalledWith( + receiveError( 'failed to send ' + action.event + ': ' + e ) + ); } ); - socket.emit( 'init' ); // force openSocket promise to resolve - socket.emit( 'accept', isAvailable ); } ); - it( 'message event', done => { - const event = 'testing msg'; - openSocket.then( () => { - expect( dispatch.getCall( 3 ) ).to.have.been.calledWithMatch( { - type: HAPPYCHAT_RECEIVE_EVENT, - event, - } ); - done(); // tell mocha the promise chain ended + test( 'connection.request should dispatch receiveError action', () => { + socket.emit = jest.fn(); + const action = requestTranscript( null ); + return connection.request( action, 100 ).catch( e => { + expect( dispatch ).toHaveBeenCalledWith( + receiveError( 'failed to send ' + action.event + ': ' + e ) + ); } ); - socket.emit( 'init' ); // force openSocket promise to resolve - socket.emit( 'message', event ); } ); } ); } ); diff --git a/client/lib/products-values/index.js b/client/lib/products-values/index.js index 623d1ee592a38..36696d8cd5de2 100644 --- a/client/lib/products-values/index.js +++ b/client/lib/products-values/index.js @@ -27,6 +27,7 @@ import { PLAN_CHARGEBACK, PLAN_MONTHLY_PERIOD, } from 'lib/plans/constants'; +import { isTransfer } from 'lib/cart-values/cart-items'; import schema from './schema.json'; @@ -53,7 +54,7 @@ function assertValidProduct( product ) { } } -function formatProduct( product ) { +export function formatProduct( product ) { return assign( {}, product, { product_slug: product.product_slug || product.productSlug, product_type: product.product_type || product.productType, @@ -65,42 +66,42 @@ function formatProduct( product ) { } ); } -function isChargeback( product ) { +export function isChargeback( product ) { product = formatProduct( product ); assertValidProduct( product ); return product.product_slug === PLAN_CHARGEBACK; } -function includesProduct( products, product ) { +export function includesProduct( products, product ) { product = formatProduct( product ); assertValidProduct( product ); return products.indexOf( product.product_slug ) >= 0; } -function isFreePlan( product ) { +export function isFreePlan( product ) { product = formatProduct( product ); assertValidProduct( product ); return product.product_slug === PLAN_FREE; } -function isFreeJetpackPlan( product ) { +export function isFreeJetpackPlan( product ) { product = formatProduct( product ); assertValidProduct( product ); return product.product_slug === PLAN_JETPACK_FREE; } -function isFreeTrial( product ) { +export function isFreeTrial( product ) { product = formatProduct( product ); assertValidProduct( product ); return Boolean( product.free_trial ); } -function isPersonal( product ) { +export function isPersonal( product ) { const personalProducts = [ PLAN_PERSONAL, PLAN_JETPACK_PERSONAL, PLAN_JETPACK_PERSONAL_MONTHLY ]; product = formatProduct( product ); @@ -109,7 +110,7 @@ function isPersonal( product ) { return personalProducts.indexOf( product.product_slug ) >= 0; } -function isPremium( product ) { +export function isPremium( product ) { const premiumProducts = [ PLAN_PREMIUM, PLAN_JETPACK_PREMIUM, PLAN_JETPACK_PREMIUM_MONTHLY ]; product = formatProduct( product ); @@ -118,7 +119,7 @@ function isPremium( product ) { return premiumProducts.indexOf( product.product_slug ) >= 0; } -function isBusiness( product ) { +export function isBusiness( product ) { const businessProducts = [ PLAN_BUSINESS, PLAN_JETPACK_BUSINESS, PLAN_JETPACK_BUSINESS_MONTHLY ]; product = formatProduct( product ); @@ -127,60 +128,60 @@ function isBusiness( product ) { return businessProducts.indexOf( product.product_slug ) >= 0; } -function isEnterprise( product ) { +export function isEnterprise( product ) { product = formatProduct( product ); assertValidProduct( product ); return product.product_slug === PLAN_WPCOM_ENTERPRISE; } -function isJetpackPlan( product ) { +export function isJetpackPlan( product ) { product = formatProduct( product ); assertValidProduct( product ); return JETPACK_PLANS.indexOf( product.product_slug ) >= 0; } -function isJetpackBusiness( product ) { +export function isJetpackBusiness( product ) { product = formatProduct( product ); assertValidProduct( product ); return isBusiness( product ) && isJetpackPlan( product ); } -function isJetpackPremium( product ) { +export function isJetpackPremium( product ) { product = formatProduct( product ); assertValidProduct( product ); return isPremium( product ) && isJetpackPlan( product ); } -function isVipPlan( product ) { +export function isVipPlan( product ) { product = formatProduct( product ); assertValidProduct( product ); return 'vip' === product.product_slug; } -function isJetpackMonthlyPlan( product ) { +export function isJetpackMonthlyPlan( product ) { return isMonthly( product ) && isJetpackPlan( product ); } -function isMonthly( product ) { +export function isMonthly( product ) { product = formatProduct( product ); assertValidProduct( product ); return parseInt( product.bill_period, 10 ) === PLAN_MONTHLY_PERIOD; } -function isJpphpBundle( product ) { +export function isJpphpBundle( product ) { product = formatProduct( product ); assertValidProduct( product ); return product.product_slug === PLAN_HOST_BUNDLE; } -function isPlan( product ) { +export function isPlan( product ) { product = formatProduct( product ); assertValidProduct( product ); @@ -193,18 +194,18 @@ function isPlan( product ) { ); } -function isDotComPlan( product ) { +export function isDotComPlan( product ) { return isPlan( product ) && ! isJetpackPlan( product ); } -function isPrivacyProtection( product ) { +export function isPrivacyProtection( product ) { product = formatProduct( product ); assertValidProduct( product ); return product.product_slug === 'private_whois'; } -function isDomainProduct( product ) { +export function isDomainProduct( product ) { product = formatProduct( product ); assertValidProduct( product ); @@ -213,42 +214,49 @@ function isDomainProduct( product ) { ); } -function isDomainRedemption( product ) { +export function isDomainRedemption( product ) { product = formatProduct( product ); assertValidProduct( product ); return product.product_slug === 'domain_redemption'; } -function isDomainRegistration( product ) { +export function isDomainRegistration( product ) { product = formatProduct( product ); assertValidProduct( product ); return !! product.is_domain_registration; } -function isDomainMapping( product ) { +export function isDomainMapping( product ) { product = formatProduct( product ); assertValidProduct( product ); return product.product_slug === 'domain_map'; } -function isSiteRedirect( product ) { +export function isSiteRedirect( product ) { product = formatProduct( product ); assertValidProduct( product ); return product.product_slug === 'offsite_redirect'; } -function isCredits( product ) { +export function isDomainTransfer( product ) { + product = formatProduct( product ); + assertValidProduct( product ); + + return isTransfer( product ); +} + +export function isCredits( product ) { product = formatProduct( product ); assertValidProduct( product ); return 'wordpress-com-credits' === product.product_slug; } -function getDomainProductRanking( product ) { +export function getDomainProductRanking( product ) { product = formatProduct( product ); assertValidProduct( product ); @@ -261,7 +269,7 @@ function getDomainProductRanking( product ) { } } -function isDependentProduct( product, dependentProduct, domainsWithPlansOnly ) { +export function isDependentProduct( product, dependentProduct, domainsWithPlansOnly ) { let isPlansOnlyDependent = false; product = formatProduct( product ); @@ -285,13 +293,13 @@ function isDependentProduct( product, dependentProduct, domainsWithPlansOnly ) { product.meta === dependentProduct.meta ) ); } -function isFreeWordPressComDomain( product ) { +export function isFreeWordPressComDomain( product ) { product = formatProduct( product ); assertValidProduct( product ); return product.is_free === true; } -function isGoogleApps( product ) { +export function isGoogleApps( product ) { product = formatProduct( product ); assertValidProduct( product ); @@ -302,60 +310,60 @@ function isGoogleApps( product ) { ); } -function isGuidedTransfer( product ) { +export function isGuidedTransfer( product ) { product = formatProduct( product ); assertValidProduct( product ); return 'guided_transfer' === product.product_slug; } -function isTheme( product ) { +export function isTheme( product ) { product = formatProduct( product ); assertValidProduct( product ); return 'premium_theme' === product.product_slug; } -function isCustomDesign( product ) { +export function isCustomDesign( product ) { product = formatProduct( product ); assertValidProduct( product ); return 'custom-design' === product.product_slug; } -function isNoAds( product ) { +export function isNoAds( product ) { product = formatProduct( product ); assertValidProduct( product ); return 'no-adverts/no-adverts.php' === product.product_slug; } -function isVideoPress( product ) { +export function isVideoPress( product ) { product = formatProduct( product ); assertValidProduct( product ); return 'videopress' === product.product_slug; } -function isUnlimitedSpace( product ) { +export function isUnlimitedSpace( product ) { product = formatProduct( product ); assertValidProduct( product ); return 'unlimited_space' === product.product_slug; } -function isUnlimitedThemes( product ) { +export function isUnlimitedThemes( product ) { product = formatProduct( product ); assertValidProduct( product ); return 'unlimited_themes' === product.product_slug; } -function whitelistAttributes( product ) { +export function whitelistAttributes( product ) { return pick( product, Object.keys( schema.properties ) ); } -function isSpaceUpgrade( product ) { +export function isSpaceUpgrade( product ) { product = formatProduct( product ); assertValidProduct( product ); @@ -381,6 +389,7 @@ export default { isDomainProduct, isDomainRedemption, isDomainRegistration, + isDomainTransfer, isDotComPlan, isEnterprise, isFreeJetpackPlan, diff --git a/client/lib/purchases/index.js b/client/lib/purchases/index.js index 34b34ff1d4ce4..44cc71a5983fd 100644 --- a/client/lib/purchases/index.js +++ b/client/lib/purchases/index.js @@ -76,7 +76,8 @@ function hasPaymentMethod( purchase ) { return ( isPaidWithPaypal( purchase ) || isPaidWithCreditCard( purchase ) || - isPaidWithPayPalDirect( purchase ) + isPaidWithPayPalDirect( purchase ) || + isPaidWithIdeal( purchase ) ); } @@ -136,6 +137,10 @@ function isPaidWithPaypal( purchase ) { return 'paypal' === purchase.payment.type; } +function isPaidWithIdeal( purchase ) { + return 'iDEAL' === purchase.payment.type; +} + function isPendingTransfer( purchase ) { return purchase.pendingTransfer; } @@ -243,6 +248,10 @@ function paymentLogoType( purchase ) { return 'paypal'; } + if ( isPaidWithIdeal( purchase ) ) { + return 'ideal'; + } + if ( isPaidWithPayPalDirect( purchase ) ) { return 'placeholder'; } diff --git a/client/lib/signup/flow-controller.js b/client/lib/signup/flow-controller.js index a08f28efc499d..39f67c8a4ab0d 100644 --- a/client/lib/signup/flow-controller.js +++ b/client/lib/signup/flow-controller.js @@ -306,6 +306,12 @@ assign( SignupFlowController.prototype, { SignupProgressStore.reset(); SignupDependencyStore.reset(); }, + + changeFlowName( flowName ) { + this._flowName = flowName; + this._flow = flows.getFlow( flowName ); + store.set( STORAGE_KEY, flowName ); + }, } ); export default SignupFlowController; diff --git a/client/lib/wpcom-undocumented/lib/undocumented.js b/client/lib/wpcom-undocumented/lib/undocumented.js index 1e80fe39c5cab..a7b7cd422c9bd 100644 --- a/client/lib/wpcom-undocumented/lib/undocumented.js +++ b/client/lib/wpcom-undocumented/lib/undocumented.js @@ -548,12 +548,30 @@ Undocumented.prototype.isDomainAvailable = function( domain, fn ) { ); }; +/** + * Get the inbound transfer status for this domain + * + * @param {string} domain - The domain name to check. + * @param {Function} fn The callback function + * @returns {Promise} A promise that resolves when the request completes + * @api public + */ +Undocumented.prototype.getInboundTransferStatus = function( domain, fn ) { + return this.wpcom.req.get( + { + path: `/domains/${ encodeURIComponent( domain ) }/inbound-transfer-status`, + }, + fn + ); +}; + /** * Determine whether a domain name can be used for Site Redirect * * @param {int|string} siteId The site ID * @param {string} domain The domain name to check * @param {function} fn The callback function + * @returns {Promise} A promise that resolves when the request completes * @api public */ Undocumented.prototype.canRedirect = function( siteId, domain, fn ) { @@ -1197,6 +1215,7 @@ Undocumented.prototype.paypalExpressUrl = function( data, fn ) { * * @param {Function} fn - The callback funtion * @api public + * @returns {Promise} promise */ Undocumented.prototype.exampleDomainSuggestions = function( fn ) { return this.wpcom.req.get( { path: '/domains/suggestions/examples' }, function( diff --git a/client/me/help/help-contact/index.jsx b/client/me/help/help-contact/index.jsx index 0123b0b38f5aa..8bca8da97db39 100644 --- a/client/me/help/help-contact/index.jsx +++ b/client/me/help/help-contact/index.jsx @@ -29,6 +29,7 @@ import notices from 'notices'; import analytics from 'lib/analytics'; import { isOlarkTimedOut } from 'state/ui/olark/selectors'; import { isCurrentUserEmailVerified } from 'state/current-user/selectors'; +import getHappychatUserInfo from 'state/happychat/selectors/get-happychat-userinfo'; import isHappychatAvailable from 'state/happychat/selectors/is-happychat-available'; import { isTicketSupportEligible, @@ -40,7 +41,7 @@ import QueryOlark from 'components/data/query-olark'; import QueryTicketSupportConfiguration from 'components/data/query-ticket-support-configuration'; import HelpUnverifiedWarning from '../help-unverified-warning'; import { - sendChatMessage as sendHappychatMessage, + sendMessage as sendHappychatMessage, sendUserInfo, } from 'state/happychat/connection/actions'; import { openChat as openHappychat } from 'state/happychat/ui/actions'; @@ -144,7 +145,7 @@ class HelpContact extends React.Component { this.props.openHappychat(); const { howCanWeHelp, howYouFeel, message, site } = contactForm; - this.props.sendUserInfo( howCanWeHelp, howYouFeel, site ); + this.props.sendUserInfo( this.props.getUserInfo( { howCanWeHelp, howYouFeel, site } ) ); this.props.sendHappychatMessage( message, { includeInSummary: true } ); analytics.tracks.recordEvent( 'calypso_help_live_chat_begin', { @@ -731,7 +732,7 @@ class HelpContact extends React.Component { > { this.getView() } - + { this.props.shouldStartHappychatConnection && } @@ -747,6 +748,7 @@ export default connect( return { currentUserLocale: getCurrentUserLocale( state ), currentUser: getCurrentUser( state ), + getUserInfo: getHappychatUserInfo( state ), hasAskedADirectlyQuestion: hasUserAskedADirectlyQuestion( state ), isDirectlyFailed: isDirectlyFailed( state ), isDirectlyReady: isDirectlyReady( state ), @@ -758,6 +760,7 @@ export default connect( ticketSupportEligible: isTicketSupportEligible( state ), ticketSupportRequestError: getTicketSupportRequestError( state ), hasMoreThanOneSite: getCurrentUserSiteCount( state ) > 1, + shouldStartHappychatConnection: ! isRequestingSites( state ) && helpSelectedSiteId, isRequestingSites: isRequestingSites( state ), isSelectedHelpSiteOnPaidPlan: isCurrentPlanPaid( state, helpSelectedSiteId ), selectedSitePlanSlug: selectedSitePlan && selectedSitePlan.product_slug, diff --git a/client/me/notification-settings/blogs-settings/blog.jsx b/client/me/notification-settings/blogs-settings/blog.jsx index cb34c4e381052..9dcc0279f7d71 100644 --- a/client/me/notification-settings/blogs-settings/blog.jsx +++ b/client/me/notification-settings/blogs-settings/blog.jsx @@ -56,6 +56,20 @@ class BlogSettings extends Component { 'is-expanded': isExpanded, } ); + const settingKeys = [ + 'new_comment', + 'comment_like', + 'post_like', + 'follow', + 'achievement', + 'mentions', + 'scheduled_publicize', + ]; + + if ( site.options.is_wpcom_store ) { + settingKeys.push( 'store_order' ); + } + return (
    @@ -72,15 +86,7 @@ class BlogSettings extends Component { onSave, onSaveToAll, } } - settingKeys={ [ - 'new_comment', - 'comment_like', - 'post_like', - 'follow', - 'achievement', - 'mentions', - 'scheduled_publicize', - ] } + settingKeys={ settingKeys } /> ); } diff --git a/client/me/notification-settings/settings-form/constants.js b/client/me/notification-settings/settings-form/constants.js index e790a8ed70e07..bacca259ed753 100644 --- a/client/me/notification-settings/settings-form/constants.js +++ b/client/me/notification-settings/settings-form/constants.js @@ -1,4 +1,4 @@ /** @format */ export const NOTIFICATIONS_EXCEPTIONS = { - email: [ 'achievement', 'scheduled_publicize' ], + email: [ 'achievement', 'scheduled_publicize', 'store_order' ], }; diff --git a/client/me/notification-settings/settings-form/locales.js b/client/me/notification-settings/settings-form/locales.js index caa4b84d4ac03..d2fc74749b81c 100644 --- a/client/me/notification-settings/settings-form/locales.js +++ b/client/me/notification-settings/settings-form/locales.js @@ -16,6 +16,8 @@ export const settingLabels = { achievement: () => i18n.translate( 'Site achievements' ), mentions: () => i18n.translate( 'Username mentions' ), scheduled_publicize: () => i18n.translate( 'Post Publicized' ), + + store_order: () => i18n.translate( 'New order' ), }; export const getLabelForStream = stream => diff --git a/client/my-sites/checkout/checkout-thank-you/features-header.jsx b/client/my-sites/checkout/checkout-thank-you/features-header.jsx index 0bf518dc20c5d..da7b6da0b20de 100644 --- a/client/my-sites/checkout/checkout-thank-you/features-header.jsx +++ b/client/my-sites/checkout/checkout-thank-you/features-header.jsx @@ -15,6 +15,7 @@ import i18n from 'i18n-calypso'; import { isDomainMapping, isDomainRegistration, + isDomainTransfer, isGoogleApps, isGuidedTransfer, } from 'lib/products-values'; @@ -37,7 +38,8 @@ const FeaturesHeader = ( { isDataLoaded, isGenericReceipt, purchases, hasFailedP purchases.some( isGoogleApps ) || purchases.some( isDomainRegistration ) || purchases.some( isDomainMapping ) || - purchases.some( isGuidedTransfer ); + purchases.some( isGuidedTransfer ) || + purchases.some( isDomainTransfer ); if ( shouldHideFeaturesHeading ) { return
    ; diff --git a/client/my-sites/checkout/checkout-thank-you/header.jsx b/client/my-sites/checkout/checkout-thank-you/header.jsx index 31ce54a4b011c..a1fae2eeafa24 100644 --- a/client/my-sites/checkout/checkout-thank-you/header.jsx +++ b/client/my-sites/checkout/checkout-thank-you/header.jsx @@ -16,6 +16,7 @@ import { isChargeback, isDomainMapping, isDomainRegistration, + isDomainTransfer, isGoogleApps, isGuidedTransfer, isPlan, @@ -46,6 +47,10 @@ class CheckoutThankYouHeader extends PureComponent { return translate( 'Thank you!' ); } + if ( primaryPurchase && isDomainTransfer( primaryPurchase ) ) { + return translate( 'Check your email for important information about your transfer.' ); + } + return translate( 'Congratulations on your purchase!' ); } @@ -136,6 +141,17 @@ class CheckoutThankYouHeader extends PureComponent { ); } + if ( isDomainTransfer( primaryPurchase ) ) { + return translate( + "We're processing your request to transfer {{strong}}%(domainName)s{{/strong}} to WordPress.com. " + + 'Be on the lookout for an important mail from us to confirm the transfer.', + { + args: { domainName: primaryPurchase.meta }, + components: { strong: }, + } + ); + } + if ( isChargeback( primaryPurchase ) ) { return translate( 'Your chargeback fee is paid. Your site is doing somersaults in excitement!' @@ -170,7 +186,7 @@ class CheckoutThankYouHeader extends PureComponent { const { translate, primaryPurchase, selectedSite } = this.props; const headerButtonClassName = 'button is-primary'; - if ( isPlan( primaryPurchase ) && ! selectedSite.jetpack ) { + if ( isPlan( primaryPurchase ) && selectedSite && ! selectedSite.jetpack ) { return (
    + +
    + + { + showPaymentChatButton && + + } +
    + + + + + + ); + } + + getPaymentProviderName() { + switch ( this.props.paymentType ) { + case 'ideal': + return 'iDEAL'; + } + + return this.props.paymentType; + } +} +SourcePaymentBox.displayName = 'SourcePaymentBox'; + +export default localize( SourcePaymentBox ); diff --git a/client/my-sites/checkout/checkout/style.scss b/client/my-sites/checkout/checkout/style.scss index 04c25f21ec5ac..8605b88d5d665 100644 --- a/client/my-sites/checkout/checkout/style.scss +++ b/client/my-sites/checkout/checkout/style.scss @@ -205,7 +205,7 @@ // Floating labels // ----------------------------------- - .checkout-field { + .checkout-field, .checkout__checkout-field { margin-top: 15px; position: relative; @@ -698,6 +698,10 @@ margin-left:8px; } + &.ideal { + margin-left: 1em; + } + @include breakpoint( "<660px" ) { border-bottom: 1px solid lighten( $gray, 30% ); margin: 10px 0 0 0; @@ -718,7 +722,7 @@ } @include breakpoint( ">660px" ) { - .payment-box__payment-buttons-test { + .payment-box__payment-buttons { display: flex; align-items: center; } @@ -844,7 +848,7 @@ .checkout__payment-box-title { padding: 20px 16px 14px 20px; font-weight: bold; - display:none; + display: none; } .select-dropdown__option { @@ -900,6 +904,12 @@ width: 80px; } + .checkout__ideal { + width: 26px; + margin-bottom: 2px; + margin-right: 4px; + } + .checkout__credit-card { margin-right: 5px; } @@ -917,7 +927,7 @@ div.section-nav { .section-nav-tabs__list { .checkout__payment-box-title { - display:block; + display: block; } } .section-nav-tab { diff --git a/client/my-sites/checkout/checkout/transfer-domain-precheck.jsx b/client/my-sites/checkout/checkout/transfer-domain-precheck.jsx new file mode 100644 index 0000000000000..865a072031ede --- /dev/null +++ b/client/my-sites/checkout/checkout/transfer-domain-precheck.jsx @@ -0,0 +1,185 @@ +/** + * External dependencies + * + * @format + */ +import PropTypes from 'prop-types'; +import React from 'react'; +import { localize } from 'i18n-calypso'; +import Gridicon from 'gridicons'; +import { isEmpty } from 'lodash'; + +/** + * Internal dependencies + */ +import Button from 'components/button'; +import Card from 'components/card'; +import SectionHeader from 'components/section-header'; +import { checkInboundTransferStatus } from 'lib/domains'; + +class TransferDomainPrecheck extends React.PureComponent { + static propTypes = { + total: PropTypes.number, + current: PropTypes.number, + domain: PropTypes.string, + setValid: PropTypes.func, + }; + + state = { + unlocked: false, + privacy: false, + email: '', + loading: true, + }; + + componentWillMount() { + this.refreshStatus(); + } + + componentWillUpdate( nextProps ) { + if ( nextProps.domain !== this.props.domain ) { + this.refreshStatus(); + } + } + + onClick = () => { + this.props.setValid( this.props.domain ); + }; + + refreshStatus = () => { + this.setState( { loading: true } ); + + checkInboundTransferStatus( this.props.domain, ( error, result ) => { + if ( ! isEmpty( error ) ) { + return; + } + + this.setState( { + email: result.admin_email, + privacy: false, + unlocked: result.unlocked, + loading: false, + } ); + } ); + }; + + getSection( icon, heading, message ) { + return ( +

    + { icon } + { heading } + { message } +

    + ); + } + + getStatusMessage() { + const { translate } = this.props; + const { unlocked } = this.state; + + const icon = unlocked ? ( + + ) : ( + + ); + const heading = unlocked + ? translate( 'Domain is unlocked.' ) + : translate( 'Unlock the domain.' ); + const message = unlocked + ? translate( 'Your domain is unlocked at your current registrar.' ) + : translate( 'Please unlock the domain at your current registrar so you can transfer it.' ); + + return this.getSection( icon, heading, message ); + } + + getPrivacyMessage() { + const { translate } = this.props; + const { email, privacy } = this.state; + + const icon = privacy ? ( + + ) : ( + + ); + const heading = privacy + ? translate( 'Whois privacy is disabled.' ) + : translate( 'Disable Whois privacy.' ); + const message = privacy + ? translate( + "We'll send an important email to %(email)s to start the domain transfer. If you don't recognize" + + 'this email address you might need to disable Whois privacy to make sure you receive it. After the transfer' + + 'is complete you can make your registration information private again.', + { + args: { email }, + } + ) + : translate( + "We'll send an important email to %(email)s to start the domain transfer. After the transfer" + + 'is complete you can enable privacy to hide your registration information again.', + { + args: { email }, + } + ); + + return this.getSection( icon, heading, message ); + } + + getEppMessage() { + const { translate } = this.props; + + const icon = ; + const heading = translate( 'Get domain authorization code.' ); + const message = translate( + 'Get an authorization code from your current registrar. This is sometimes ' + + 'called a secret code, EPP code, or auth code. You will need it to initiate the transfer.' + ); + + return this.getSection( icon, heading, message ); + } + + render() { + const { current, domain, total, translate } = this.props; + + let headerLabel = translate( 'Prepare Domain' ); + if ( total > 1 ) { + headerLabel = translate( 'Prepare Domain %(current)s of %(total)s: %(domain)s', { + args: { + current: current + 1, + total, + domain, + }, + } ); + } + + return ( +
    + + + + +

    + { translate( + 'Log in to your current registrar and complete these steps to prepare your domain for transfer. ' + + 'Changes can take up to X minutes to update. {{a}}Need Help?{{/a}}', + { + components: { + a: , + }, + } + ) } +

    + { this.getStatusMessage() } + { this.getPrivacyMessage() } + { this.getEppMessage() } + +
    +
    + ); + } +} + +export default localize( TransferDomainPrecheck ); diff --git a/client/my-sites/comments/comment-list/comment-list-header.jsx b/client/my-sites/comments/comment-list/comment-list-header.jsx new file mode 100644 index 0000000000000..4e7bb9e30f333 --- /dev/null +++ b/client/my-sites/comments/comment-list/comment-list-header.jsx @@ -0,0 +1,92 @@ +/** @format */ +/** + * External dependencies + */ +import React from 'react'; +import { connect } from 'react-redux'; +import { localize } from 'i18n-calypso'; +import { get } from 'lodash'; + +/** + * Internal dependencies + */ +import HeaderCake from 'components/header-cake'; +import QueryPosts from 'components/data/query-posts'; +import { convertDateToUserLocation } from 'components/post-schedule/utils'; +import { decodeEntities, stripHTML } from 'lib/formatting'; +import { gmtOffset, timezone } from 'lib/site/utils'; +import { bumpStat, composeAnalytics, recordTracksEvent } from 'state/analytics/actions'; +import { getSiteComments } from 'state/selectors'; +import { getSitePost } from 'state/posts/selectors'; +import { isJetpackSite } from 'state/sites/selectors'; +import { getSelectedSite, getSelectedSiteId, getSelectedSiteSlug } from 'state/ui/selectors'; + +export const CommentListHeader = ( { + postDate, + postId, + postTitle, + postUrl, + recordReaderArticleOpened, + site, + siteId, + siteSlug, + translate, +} ) => { + const formattedDate = postDate + ? convertDateToUserLocation( postDate, timezone( site ), gmtOffset( site ) ).format( 'll LT' ) + : ''; + + return ( +
    + + + +
    { postTitle }
    +
    { formattedDate }
    +
    +
    + ); +}; + +const mapStateToProps = ( state, { postId } ) => { + const site = getSelectedSite( state ); + const siteId = getSelectedSiteId( state ); + const siteSlug = getSelectedSiteSlug( state ); + const post = getSitePost( state, siteId, postId ); + const postDate = get( post, 'date' ); + const postTitle = decodeEntities( + stripHTML( + get( post, 'title' ) || + get( post, 'excerpt' ) || + get( getSiteComments( state, siteId ), '[0].post.title' ) + ) + ); + const isJetpack = isJetpackSite( state, siteId ); + + return { + postDate, + postTitle, + postUrl: isJetpack ? get( post, 'URL' ) : `/read/blogs/${ siteId }/posts/${ postId }`, + site, + siteId, + siteSlug, + }; +}; + +const mapDispatchToProps = dispatch => ( { + recordReaderArticleOpened: () => + dispatch( + composeAnalytics( + recordTracksEvent( 'calypso_comment_management_article_opened' ), + bumpStat( 'calypso_comment_management', 'article_opened' ) + ) + ), +} ); + +export default connect( mapStateToProps, mapDispatchToProps )( localize( CommentListHeader ) ); diff --git a/client/my-sites/comments/comment-list/index.jsx b/client/my-sites/comments/comment-list/index.jsx index 06dd611f6c996..f8df2c00ebf00 100644 --- a/client/my-sites/comments/comment-list/index.jsx +++ b/client/my-sites/comments/comment-list/index.jsx @@ -8,12 +8,13 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { localize } from 'i18n-calypso'; -import { each, find, get, map, orderBy, size, slice, uniq } from 'lodash'; +import { each, filter, find, get, map, orderBy, size, slice, uniq } from 'lodash'; import ReactCSSTransitionGroup from 'react-transition-group/CSSTransitionGroup'; /** * Internal dependencies */ +import { isEnabled } from 'config'; import { changeCommentStatus, deleteComment, @@ -23,9 +24,11 @@ import { unlikeComment, } from 'state/comments/actions'; import { removeNotice, successNotice } from 'state/notices/actions'; +import Comment from 'my-sites/comments/comment'; import CommentDetail from 'blocks/comment-detail'; import CommentDetailPlaceholder from 'blocks/comment-detail/comment-detail-placeholder'; -import CommentNavigation from '../comment-navigation'; +import CommentListHeader from 'my-sites/comments/comment-list/comment-list-header'; +import CommentNavigation from 'my-sites/comments/comment-navigation'; import EmptyContent from 'components/empty-content'; import Pagination from 'components/pagination'; import QuerySiteCommentsList from 'components/data/query-site-comments-list'; @@ -38,7 +41,7 @@ import { recordTracksEvent, withAnalytics, } from 'state/analytics/actions'; -import { isJetpackSite } from 'state/sites/selectors'; +import { isJetpackMinimumVersion, isJetpackSite } from 'state/sites/selectors'; import { COMMENTS_PER_PAGE, NEWEST_FIRST } from '../constants'; export class CommentList extends Component { @@ -187,7 +190,7 @@ export class CommentList extends Component { }; setBulkStatus = status => () => { - const { recordBulkAction, status: listStatus } = this.props; + const { postId, recordBulkAction, status: listStatus } = this.props; const { selectedComments } = this.state; this.props.removeNotice( 'comment-notice-bulk' ); @@ -210,7 +213,7 @@ export class CommentList extends Component { } ); } ); - recordBulkAction( status, selectedComments.length, listStatus ); + recordBulkAction( status, selectedComments.length, listStatus, !! postId ? 'post' : 'site' ); this.showBulkNotice( status ); @@ -402,7 +405,16 @@ export class CommentList extends Component { }; render() { - const { isJetpack, isLoading, page, siteBlacklist, siteId, siteFragment, status } = this.props; + const { + isCommentsTreeSupported, + isLoading, + page, + postId, + siteBlacklist, + siteId, + siteFragment, + status, + } = this.props; const { isBulkEdit, selectedComments } = this.state; const validPage = this.isRequestedPageValid() ? page : 1; @@ -420,7 +432,7 @@ export class CommentList extends Component {
    - { isJetpack && ( + { ! isCommentsTreeSupported && ( ) } - { ! isJetpack && } + { isCommentsTreeSupported && } + + { !! postId && } + - { map( commentsPage, commentId => ( - - ) ) } - - { showPlaceholder && } + { isEnabled( 'comments/management/m3-design' ) && + map( commentsPage, commentId => ( + + ) ) } + + { isEnabled( 'comments/management/m3-design' ) && + showPlaceholder && } + + { ! isEnabled( 'comments/management/m3-design' ) && + map( commentsPage, commentId => ( + + ) ) } + + { ! isEnabled( 'comments/management/m3-design' ) && + showPlaceholder && } { showEmptyContent && ( { - const comments = map( getSiteCommentsTree( state, siteId, status ), 'commentId' ); +const mapStateToProps = ( state, { postId, siteId, status } ) => { + const siteCommentsTree = getSiteCommentsTree( state, siteId, status ); + const comments = !! postId + ? map( filter( siteCommentsTree, { postId } ), 'commentId' ) + : map( siteCommentsTree, 'commentId' ); + const isLoading = ! isCommentsTreeInitialized( state, siteId, status ); return { comments, - isJetpack: isJetpackSite( state, siteId ), + isCommentsTreeSupported: + ! isJetpackSite( state, siteId ) || isJetpackMinimumVersion( state, siteId, '5.5' ), isLoading, siteBlacklist: getSiteSetting( state, siteId, 'blacklist_keys' ), siteId, diff --git a/client/my-sites/comments/comment-navigation/index.jsx b/client/my-sites/comments/comment-navigation/index.jsx index 42de3581124dc..1fa32d8cbc61f 100644 --- a/client/my-sites/comments/comment-navigation/index.jsx +++ b/client/my-sites/comments/comment-navigation/index.jsx @@ -32,8 +32,8 @@ import { getSiteComment } from 'state/selectors'; import { NEWEST_FIRST, OLDEST_FIRST } from '../constants'; const bulkActions = { - unapproved: [ 'approve', 'spam', 'trash' ], - approved: [ 'unapprove', 'spam', 'trash' ], + unapproved: [ 'approve', 'unapprove', 'spam', 'trash' ], + approved: [ 'approve', 'unapprove', 'spam', 'trash' ], spam: [ 'approve', 'delete' ], trash: [ 'approve', 'spam', 'delete' ], all: [ 'approve', 'unapprove', 'spam', 'trash' ], @@ -82,10 +82,15 @@ export class CommentNavigation extends Component { return navItems; }; - getStatusPath = status => - 'unapproved' !== status - ? `/comments/${ status }/${ this.props.siteFragment }` - : `/comments/pending/${ this.props.siteFragment }`; + getStatusPath = status => { + const { postId } = this.props; + + const appendPostId = !! postId ? `/${ postId }` : ''; + + return 'unapproved' !== status + ? `/comments/${ status }/${ this.props.siteFragment }${ appendPostId }` + : `/comments/pending/${ this.props.siteFragment }${ appendPostId }`; + }; statusHasAction = action => includes( bulkActions[ this.props.status ], action ); @@ -101,6 +106,7 @@ export class CommentNavigation extends Component { const { doSearch, hasSearch, + hasComments, isBulkEdit, isCommentsTreeSupported, isSelectedAll, @@ -203,7 +209,8 @@ export class CommentNavigation extends Component { { isEnabled( 'comments/management/sorting' ) && - isCommentsTreeSupported && ( + isCommentsTreeSupported && + hasComments && ( ) } - + { hasComments && ( + + ) } { hasSearch && ( @@ -252,6 +261,7 @@ const mapStateToProps = ( state, { commentsPage, siteId } ) => { return { visibleComments, + hasComments: visibleComments.length > 0, isCommentsTreeSupported: ! isJetpackSite( state, siteId ) || isJetpackMinimumVersion( state, siteId, '5.3' ), }; diff --git a/client/my-sites/comments/comment/comment-author-more-info.jsx b/client/my-sites/comments/comment/comment-author-more-info.jsx index 1908760ee888f..75637a1f42f19 100644 --- a/client/my-sites/comments/comment/comment-author-more-info.jsx +++ b/client/my-sites/comments/comment/comment-author-more-info.jsx @@ -3,33 +3,254 @@ * External dependencies */ import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import { localize } from 'i18n-calypso'; +import Gridicon from 'gridicons'; +import { get } from 'lodash'; /** * Internal dependencies */ -import InfoPopover from 'components/info-popover'; +import Button from 'components/button'; +import Emojify from 'components/emojify'; +import ExternalLink from 'components/external-link'; +import Popover from 'components/popover'; +import { decodeEntities } from 'lib/formatting'; +import { urlToDomainAndPath } from 'lib/url'; +import { + canCurrentUser, + getSiteComment, + getSiteSetting, + isEmailBlacklisted, +} from 'state/selectors'; +import { + bumpStat, + composeAnalytics, + recordTracksEvent, + withAnalytics, +} from 'state/analytics/actions'; +import { getCurrentUserEmail } from 'state/current-user/selectors'; +import { successNotice } from 'state/notices/actions'; +import { saveSiteSettings } from 'state/site-settings/actions'; +import { getSelectedSiteId, getSelectedSiteSlug } from 'state/ui/selectors'; export class CommentAuthorMoreInfo extends Component { - storeLabelRef = label => ( this.authorMoreInfoLabel = label ); + static propTypes = { + commentId: PropTypes.number, + }; - storePopoverRef = popover => ( this.authorMoreInfoPopover = popover ); + state = { + showPopover: false, + }; - openAuthorMoreInfoPopover = event => this.authorMoreInfoPopover.handleClick( event ); + storePopoverButtonRef = button => ( this.popoverButton = button ); + + closePopover = () => this.setState( { showPopover: false } ); + + togglePopover = () => this.setState( ( { showPopover } ) => ( { showPopover: ! showPopover } ) ); + + toggleBlockUser = () => { + const { + authorEmail, + authorId, + commentId, + isAuthorBlacklisted, + showNotice, + siteBlacklist, + siteId, + translate, + updateBlacklist, + } = this.props; + + const noticeOptions = { + duration: 5000, + id: `comment-notice-${ commentId }`, + isPersistent: true, + }; + + const analytics = { + action: isAuthorBlacklisted ? 'unblock_user' : 'block_user', + user_type: authorId ? 'wpcom' : 'email_only', + }; + + if ( isAuthorBlacklisted ) { + const newBlacklist = siteBlacklist + .split( '\n' ) + .filter( item => item !== authorEmail ) + .join( '\n' ); + + updateBlacklist( siteId, newBlacklist, analytics ); + + return showNotice( + translate( 'User %(email)s unblocked.', { args: { email: authorEmail } } ), + noticeOptions + ); + } + + const newBlacklist = !! siteBlacklist ? siteBlacklist + '\n' + authorEmail : authorEmail; + + updateBlacklist( siteId, newBlacklist, analytics ); + + showNotice( + translate( 'User %(email)s is blocked and can no longer comment on your site.', { + args: { email: authorEmail }, + } ), + noticeOptions + ); + }; render() { + const { + authorDisplayName, + authorEmail, + authorIp, + authorUrl, + authorUsername, + isAuthorBlacklisted, + showBlockUser, + siteSlug, + trackAnonymousModeration, + translate, + } = this.props; + + const { showPopover } = this.state; + return ( -
    - - Author More Info - - + ); } } -export default CommentAuthorMoreInfo; +const mapStateToProps = ( state, { commentId } ) => { + const siteId = getSelectedSiteId( state ); + const comment = getSiteComment( state, siteId, commentId ); + + const authorDisplayName = decodeEntities( get( comment, 'author.name' ) ); + const authorEmail = get( comment, 'author.email' ); + + const showBlockUser = + canCurrentUser( state, siteId, 'manage_options' ) && + !! authorEmail && + authorEmail !== getCurrentUserEmail( state ); + + return { + authorDisplayName, + authorEmail, + authorId: get( comment, 'author.ID' ), + authorIp: get( comment, 'author.ip_address' ), + authorUsername: get( comment, 'author.nice_name' ), + authorUrl: get( comment, 'author.URL', '' ), + isAuthorBlacklisted: isEmailBlacklisted( state, siteId, authorEmail ), + showBlockUser, + siteBlacklist: getSiteSetting( state, siteId, 'blacklist_keys' ), + siteId, + siteSlug: getSelectedSiteSlug( state ), + }; +}; + +const mapDispatchToProps = dispatch => ( { + showNotice: ( text, options ) => dispatch( successNotice( text, options ) ), + updateBlacklist: ( siteId, blacklist_keys, analytics ) => + dispatch( + withAnalytics( + composeAnalytics( + recordTracksEvent( 'calypso_comment_management_moderate_user', analytics ), + bumpStat( + 'calypso_comment_management', + 'block_user' === analytics.action + ? 'comment_author_blocked' + : 'comment_author_unblocked' + ) + ), + saveSiteSettings( siteId, { blacklist_keys } ) + ) + ), + trackAnonymousModeration: () => + dispatch( + composeAnalytics( + recordTracksEvent( 'calypso_comment_management_moderate_user', { + action: 'open_discussion_settings', + user_type: 'anonymous', + } ), + bumpStat( 'calypso_comment_management', 'open_discussion_settings' ) + ) + ), +} ); + +export default connect( mapStateToProps, mapDispatchToProps )( localize( CommentAuthorMoreInfo ) ); diff --git a/client/my-sites/comments/comment/comment-author.jsx b/client/my-sites/comments/comment/comment-author.jsx index 8ce67f726036a..4f75a1b837898 100644 --- a/client/my-sites/comments/comment/comment-author.jsx +++ b/client/my-sites/comments/comment/comment-author.jsx @@ -16,12 +16,10 @@ import Emojify from 'components/emojify'; import ExternalLink from 'components/external-link'; import Gravatar from 'components/gravatar'; import CommentPostLink from 'my-sites/comments/comment/comment-post-link'; -import { convertDateToUserLocation } from 'components/post-schedule/utils'; import { decodeEntities } from 'lib/formatting'; -import { gmtOffset, timezone } from 'lib/site/utils'; import { urlToDomainAndPath } from 'lib/url'; import { getSiteComment } from 'state/selectors'; -import { getSelectedSite, getSelectedSiteId } from 'state/ui/selectors'; +import { getSelectedSiteId } from 'state/ui/selectors'; export class CommentAuthor extends Component { static propTypes = { @@ -31,6 +29,7 @@ export class CommentAuthor extends Component { render() { const { + authorAvatarUrl, authorDisplayName, authorUrl, commentDate, @@ -40,29 +39,24 @@ export class CommentAuthor extends Component { gravatarUser, isExpanded, moment, - site, translate, } = this.props; - const localizedDate = convertDateToUserLocation( - commentDate || moment(), - timezone( site ), - gmtOffset( site ) - ); - - const formattedDate = localizedDate.format( 'll LT' ); + const formattedDate = moment( commentDate ).format( 'll LT' ); const relativeDate = moment() .subtract( 1, 'month' ) - .isBefore( localizedDate ) - ? localizedDate.fromNow() - : localizedDate.format( 'll' ); + .isBefore( commentDate ) + ? moment( commentDate ).fromNow() + : moment( commentDate ).format( 'll' ); return (
    { /* A comment can be of type 'comment', 'pingback' or 'trackback'. */ } - { 'comment' === commentType && } + { 'comment' === commentType && !! authorAvatarUrl && } + { 'comment' === commentType && + ! authorAvatarUrl && } { 'comment' !== commentType && }
    @@ -80,12 +74,14 @@ export class CommentAuthor extends Component { { isExpanded ? formattedDate : relativeDate } - - · - - { urlToDomainAndPath( authorUrl ) } - - + { authorUrl && ( + + · + + { urlToDomainAndPath( authorUrl ) } + + + ) }
    @@ -94,7 +90,6 @@ export class CommentAuthor extends Component { } const mapStateToProps = ( state, { commentId } ) => { - const site = getSelectedSite( state ); const siteId = getSelectedSiteId( state ); const comment = getSiteComment( state, siteId, commentId ); @@ -110,7 +105,6 @@ const mapStateToProps = ( state, { commentId } ) => { commentType: get( comment, 'type', 'comment' ), commentUrl: get( comment, 'URL' ), gravatarUser, - site, }; }; diff --git a/client/my-sites/comments/comment/comment-content.jsx b/client/my-sites/comments/comment/comment-content.jsx index 08bd44de4034c..54fbb4b4b4838 100644 --- a/client/my-sites/comments/comment/comment-content.jsx +++ b/client/my-sites/comments/comment/comment-content.jsx @@ -49,7 +49,7 @@ export class CommentContent extends Component { }; render() { - const { commentContent, commentId, isExpanded } = this.props; + const { commentContent, commentId, commentStatus, isExpanded, translate } = this.props; return (
    { ! isExpanded && ( @@ -64,7 +64,13 @@ export class CommentContent extends Component { { isExpanded && (
    - +
    + + + { 'unapproved' === commentStatus && ( +
    { translate( 'Pending' ) }
    + ) } +
    { this.renderInReplyTo() } @@ -98,6 +104,7 @@ const mapStateToProps = ( state, { commentId } ) => { return { commentContent: get( comment, 'content' ), + commentStatus: get( comment, 'status' ), commentUrl, isJetpack, parentCommentContent, diff --git a/client/my-sites/comments/comment/comment-header.jsx b/client/my-sites/comments/comment/comment-header.jsx index c6999d11a105d..20214b8043c0f 100644 --- a/client/my-sites/comments/comment/comment-header.jsx +++ b/client/my-sites/comments/comment/comment-header.jsx @@ -2,9 +2,10 @@ /** * External dependencies */ -import React from 'react'; +import React, { PureComponent } from 'react'; +import { connect } from 'react-redux'; import Gridicon from 'gridicons'; -import noop from 'lodash'; +import { get } from 'lodash'; /** * Internal dependencies @@ -13,37 +14,60 @@ import Button from 'components/button'; import CommentAuthor from 'my-sites/comments/comment/comment-author'; import CommentAuthorMoreInfo from 'my-sites/comments/comment/comment-author-more-info'; import FormCheckbox from 'components/forms/form-checkbox'; +import { getMinimumComment } from 'my-sites/comments/comment/utils'; +import { getSiteComment } from 'state/selectors'; +import { getSelectedSiteId } from 'state/ui/selectors'; -export const CommentHeader = ( { - commentId, - isBulkMode, - isEditMode, - isExpanded, - isSelected, - toggleExpanded, -} ) => ( -
    - { isBulkMode && ( - - ) } - - - - { isExpanded && } - - { ! isBulkMode && ( - - ) } -
    -); - -export default CommentHeader; +export class CommentHeader extends PureComponent { + toggleSelected = () => this.props.toggleSelected( this.props.minimumComment ); + + render() { + const { + commentId, + isBulkMode, + isEditMode, + isExpanded, + isSelected, + showAuthorMoreInfo, + toggleExpanded, + } = this.props; + + return ( +
    + { isBulkMode && ( + + ) } + + + + { showAuthorMoreInfo && } + + { ! isBulkMode && ( + + ) } +
    + ); + } +} + +const mapStateToProps = ( state, { commentId, isExpanded } ) => { + const siteId = getSelectedSiteId( state ); + const comment = getSiteComment( state, siteId, commentId ); + const commentType = get( comment, 'type', 'comment' ); + + return { + minimumComment: getMinimumComment( comment ), + showAuthorMoreInfo: isExpanded && 'comment' === commentType, + }; +}; + +export default connect( mapStateToProps )( CommentHeader ); diff --git a/client/my-sites/comments/comment/comment-post-link.jsx b/client/my-sites/comments/comment/comment-post-link.jsx index 79762694ee961..26d9beb3556c7 100644 --- a/client/my-sites/comments/comment/comment-post-link.jsx +++ b/client/my-sites/comments/comment/comment-post-link.jsx @@ -23,6 +23,7 @@ const CommentPostLink = ( { postTitle, siteId, siteSlug, + status, translate, } ) => (
    @@ -41,6 +42,7 @@ const mapStateToProps = ( state, { commentId } ) => { const siteSlug = getSelectedSiteSlug( state ); const comment = getSiteComment( state, siteId, commentId ); + const commentStatus = get( comment, 'status' ); const postId = get( comment, 'post.ID' ); const post = getSitePost( state, siteId, postId ); @@ -53,6 +55,8 @@ const mapStateToProps = ( state, { commentId } ) => { postId, postTitle, siteSlug, + siteId, + status: 'unapproved' === commentStatus ? 'pending' : commentStatus, }; }; diff --git a/client/my-sites/comments/comment/index.jsx b/client/my-sites/comments/comment/index.jsx index 039d40496d704..a2f0b3e039eb3 100644 --- a/client/my-sites/comments/comment/index.jsx +++ b/client/my-sites/comments/comment/index.jsx @@ -4,8 +4,10 @@ */ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; import classNames from 'classnames'; import ReactDom from 'react-dom'; +import { get, isUndefined } from 'lodash'; /** * Internal dependencies @@ -13,18 +15,21 @@ import ReactDom from 'react-dom'; import Card from 'components/card'; import CommentContent from 'my-sites/comments/comment/comment-content'; import CommentHeader from 'my-sites/comments/comment/comment-header'; +import QueryComment from 'components/data/query-comment'; +import { getSiteComment } from 'state/selectors'; +import { getSelectedSiteId } from 'state/ui/selectors'; export class Comment extends Component { static propTypes = { commentId: PropTypes.number, isBulkMode: PropTypes.bool, - isLoading: PropTypes.bool, isSelected: PropTypes.bool, + refreshCommentData: PropTypes.bool, + toggleSelected: PropTypes.func, }; static defaultProps = { isBulkMode: false, - isLoading: false, isSelected: false, }; @@ -33,6 +38,12 @@ export class Comment extends Component { isExpanded: false, }; + componentWillReceiveProps( nextProps ) { + if ( nextProps.isBulkMode && ! this.props.isBulkMode ) { + this.setState( { isExpanded: false } ); + } + } + storeCardRef = card => ( this.commentCard = card ); keyDownHandler = event => { @@ -59,13 +70,24 @@ export class Comment extends Component { }; render() { - const { commentId, isBulkMode, isSelected } = this.props; + const { + commentId, + commentStatus, + isBulkMode, + isLoading, + isSelected, + refreshCommentData, + siteId, + toggleSelected, + } = this.props; const { isEditMode, isExpanded } = this.state; const classes = classNames( 'comment', { 'is-bulk-mode': isBulkMode, 'is-collapsed': ! isExpanded && ! isBulkMode, 'is-expanded': isExpanded, + 'is-placeholder': isLoading, + 'is-unapproved': 'unapproved' === commentStatus, } ); return ( @@ -75,10 +97,14 @@ export class Comment extends Component { ref={ this.storeCardRef } tabIndex="0" > + { refreshCommentData && ( + + ) } + { ! isEditMode && (
    @@ -90,4 +116,14 @@ export class Comment extends Component { } } -export default Comment; +const mapStateToProps = ( state, { commentId } ) => { + const siteId = getSelectedSiteId( state ); + const comment = getSiteComment( state, siteId, commentId ); + return { + commentStatus: get( comment, 'status' ), + isLoading: isUndefined( comment ), + siteId, + }; +}; + +export default connect( mapStateToProps )( Comment ); diff --git a/client/my-sites/comments/comment/style.scss b/client/my-sites/comments/comment/style.scss index f427c7c8112d6..696ed72abe115 100644 --- a/client/my-sites/comments/comment/style.scss +++ b/client/my-sites/comments/comment/style.scss @@ -6,7 +6,6 @@ font-size: 14px; margin: 0 auto; padding: 0; - transition: margin 0.15s linear; .accessible-focus &:focus { box-shadow: 0 0 0 1px $blue-medium, 0 0 0 3px $blue-light; @@ -14,6 +13,11 @@ } } +// `transition` here is applied with less specificity to avoid overwriting ReactCSSTransitionGroup's animation. +.comment { + transition: margin 0.15s linear; +} + // Comment Header Block .comment__header { @@ -46,8 +50,11 @@ transition: transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275), color 0.2s ease-in; } - &:hover .gridicon { - fill: $blue-medium; + &:focus, + &:hover { + .gridicon { + fill: $blue-medium; + } } } @@ -118,30 +125,59 @@ // Comment Author More Info Block .comment__author-more-info { - align-items: center; + align-items: stretch; display: flex; - color: $gray-text-min; - cursor: pointer; flex-grow: 0; flex-shrink: 0; - padding: 8px 16px 8px 8px; - .gridicon { - fill: $gray-text-min; - } + .button.is-borderless { + border-radius: 0; + font-weight: 400; + padding: 0 16px 0 8px; - &:focus, - &:hover { - .gridicon, - label { - color: $gray-dark; - cursor: pointer; - fill: $gray-dark; + .gridicon { + height: 18px; + margin-right: 4px; + top: 3px; + width: 18px; } } +} + +.popover.comment__author-more-info-popover { + /* applying a lower z-index to ensure it is layered behind global notice */ + z-index: z-index('root', '.popover.comment-detail__author-more-info'); + + .popover__inner { + color: $gray-text-min; + font-size: 13px; + max-width: 220px; + padding: 16px; + text-align: left; + } +} + +.comment__author-more-info-element { + align-items: center; + display: flex; + flex-flow: row; + flex-wrap: nowrap; + margin-bottom: 8px; + word-break: break-all; + + &:last-child { + margin-bottom: 0; + } .gridicon { - margin: 4px 4px 0 0; + flex-grow: 0; + flex-shrink: 0; + margin-right: 8px; + width: 24px; + } + + .button { + width: 100%; } } @@ -150,13 +186,16 @@ .comment__content { padding: 0 16px 16px 56px; - @include breakpoint( '>480px' ) { - padding-right: 56px; + .comment__content-info { + display: flex; + flex-flow: row; + flex-wrap: nowrap; + justify-content: space-between; + margin: 8px 0 1em 0; } .comment__post-link { font-weight: 600; - margin: 8px 0 1em 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; @@ -166,6 +205,16 @@ } } + .comment__status-label { + align-self: center; + background: lighten($alert-yellow, 18%); + border-radius: 9px; + flex-grow: 0; + flex-shrink: 0; + font-size: 12px; + padding: 0 10px; + } + .comment__in-reply-to { color: $gray-text-min; overflow: hidden; @@ -230,6 +279,16 @@ } } +// Collapsed View + +.card.comment.is-collapsed { + &.is-unapproved { + background: mix($alert-yellow, $white, 8.5%); + box-shadow: inset 4px 0 0 0 $alert-yellow, 0 0 0 1px transparentize(lighten($gray, 20%), 0.5), + 0 1px 2px lighten($gray, 30%); + } +} + // Expanded View .card.comment.is-expanded { @@ -265,3 +324,60 @@ padding-left: 0; } } + +// Placeholder View + +.card.comment.is-placeholder { + @include placeholder(); + + background-color: $white; + + .comment__bulk-select { + display: none; + } + + .comment__header .comment__author { + padding: 8px; + } + + .comment__author-gravatar-placeholder { + background-color: lighten($gray, 30%); + border-radius: 50%; + display: block; + height: 32px; + width: 32px; + } + + .comment__author-info { + padding: 5px 8px 5px 0; + } + + .comment__author-info-element { + background-color: lighten($gray, 30%); + color: transparent; + height: 16px; + + a, + a:focus, + a:hover, + .gridicon, + .comment__author-url-separator { + color: transparent; + cursor: default; + } + } + + .button.comment__toggle-expanded { + display: none; + } + + .comment__content-preview { + background-color: lighten($gray, 30%); + color: transparent; + height: 21px; + } + + .comment__in-reply-to { + display: none; + } +} diff --git a/client/my-sites/comments/comment/utils.js b/client/my-sites/comments/comment/utils.js index 94b4fbb32aeae..cec844a3cba72 100644 --- a/client/my-sites/comments/comment/utils.js +++ b/client/my-sites/comments/comment/utils.js @@ -2,28 +2,17 @@ /** * External dependencies */ -import { get, includes } from 'lodash'; +import { get } from 'lodash'; /** - * Create a stripped down comment object containing only the information needed by - * CommentList's change status and reply functions, and their respective undos. + * Create a stripped down comment object containing only the bare minimum fields needed by CommentList's actions. * * @param {Object} comment A comment object. * @returns {Object} A stripped down comment object. */ -export const getMinimalComment = comment => ( { +export const getMinimumComment = comment => ( { commentId: get( comment, 'ID' ), isLiked: get( comment, 'i_like' ), postId: get( comment, 'post.ID' ), status: get( comment, 'status' ), } ); - -/** - * Check if a site blacklist contains an email address. - * - * @param {String} blacklist A site blacklist. - * @param {String} email An email address. - * @returns {Boolean} If the blacklist contains the email address. - */ -export const isEmailBlacklisted = ( blacklist, email ) => - !! email && !! blacklist ? includes( blacklist.split( '\n' ), email ) : false; diff --git a/client/my-sites/comments/main.jsx b/client/my-sites/comments/main.jsx index 4940ab87e3888..e506fb4cdeb7c 100644 --- a/client/my-sites/comments/main.jsx +++ b/client/my-sites/comments/main.jsx @@ -4,13 +4,17 @@ */ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import config from 'config'; import { connect } from 'react-redux'; import { localize } from 'i18n-calypso'; +import { find } from 'lodash'; /** * Internal dependencies */ +import EmptyContent from 'components/empty-content'; import getSiteId from 'state/selectors/get-site-id'; +import { isJetpackSite, isJetpackMinimumVersion } from 'state/sites/selectors'; import Main from 'components/main'; import PageViewTracker from 'lib/analytics/page-view-tracker'; import DocumentHead from 'components/data/document-head'; @@ -18,12 +22,16 @@ import CommentList from './comment-list'; import SidebarNavigation from 'my-sites/sidebar-navigation'; import { canCurrentUser } from 'state/selectors'; import { preventWidows } from 'lib/formatting'; -import EmptyContent from 'components/empty-content'; +import QueryJetpackPlugins from 'components/data/query-jetpack-plugins'; +import { updatePlugin } from 'state/plugins/installed/actions'; +import { getPlugins } from 'state/plugins/installed/selectors'; +import { infoNotice } from 'state/notices/actions'; export class CommentsManagement extends Component { static propTypes = { comments: PropTypes.array, page: PropTypes.number, + postId: PropTypes.number, showPermissionError: PropTypes.bool, siteId: PropTypes.number, siteFragment: PropTypes.oneOfType( [ PropTypes.string, PropTypes.number ] ), @@ -36,11 +44,20 @@ export class CommentsManagement extends Component { status: 'all', }; + updateJetpackHandler = () => { + const { siteId, translate, jetpackPlugin } = this.props; + + this.props.infoNotice( translate( 'Please wait while we update your Jetpack plugin.' ) ); + this.props.updatePlugin( siteId, jetpackPlugin ); + }; + render() { const { - showPermissionError, - page, changePage, + showJetpackUpdateScreen, + page, + postId, + showPermissionError, siteId, siteFragment, status, @@ -49,10 +66,23 @@ export class CommentsManagement extends Component { return (
    + { showJetpackUpdateScreen && } - - { showPermissionError && ( + { showJetpackUpdateScreen && ( + + ) } + { ! showJetpackUpdateScreen && } + { ! showJetpackUpdateScreen && + showPermissionError && ( ) } - { ! showPermissionError && ( + { ! showJetpackUpdateScreen && + ! showPermissionError && ( ) }
    @@ -80,11 +112,27 @@ export class CommentsManagement extends Component { const mapStateToProps = ( state, { siteFragment } ) => { const siteId = getSiteId( state, siteFragment ); + const isJetpack = isJetpackSite( state, siteId ); const canModerateComments = canCurrentUser( state, siteId, 'moderate_comments' ); + const showJetpackUpdateScreen = + isJetpack && + ! isJetpackMinimumVersion( state, siteId, '5.5' ) && + config.isEnabled( 'comments/management/jetpack-5.5' ); + + const sitePlugins = getPlugins( state, [ siteId ] ); + const jetpackPlugin = find( sitePlugins, { slug: 'jetpack' } ); + return { siteId, + jetpackPlugin, + showJetpackUpdateScreen, showPermissionError: canModerateComments === false, }; }; -export default connect( mapStateToProps )( localize( CommentsManagement ) ); +const mapDispatchToProps = { + updatePlugin, + infoNotice, +}; + +export default connect( mapStateToProps, mapDispatchToProps )( localize( CommentsManagement ) ); diff --git a/client/my-sites/comments/style.scss b/client/my-sites/comments/style.scss index 598af87a8b90b..f86a88c09b438 100644 --- a/client/my-sites/comments/style.scss +++ b/client/my-sites/comments/style.scss @@ -1,5 +1,6 @@ +/** @format */ .comment-navigation { - @include breakpoint( "<480px" ) { + @include breakpoint( '<480px' ) { .section-nav__mobile-header:after { padding-left: 8px; } @@ -20,13 +21,13 @@ .comment-navigation.is-bulk-edit { padding-right: 0; - @include breakpoint( "<480px" ) { + @include breakpoint( '<480px' ) { .section-nav__mobile-header { display: none; } .comment-navigation__bulk-count { - width: calc( 100% - 70px ); + width: calc(100% - 70px); } .comment-navigation__close-bulk { @@ -73,6 +74,19 @@ } } +.comment-list__header-title { + font-weight: 600; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.comment-list__header-date { + font-size: 13px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + .comment-list .pagination { margin-top: 16px; } @@ -81,7 +95,7 @@ display: none; &.comment-list__transition-enter-active { - animation: comment-list__transition-enter .15s linear; + animation: comment-list__transition-enter 0.15s linear; } } @@ -90,7 +104,7 @@ &.comment-list__transition-leave-active { opacity: 0.01; - transition: opacity .15s linear; + transition: opacity 0.15s linear; } } diff --git a/client/my-sites/domains/components/domain-warnings/index.jsx b/client/my-sites/domains/components/domain-warnings/index.jsx index 7a38ad1e4ee19..7caac27881152 100644 --- a/client/my-sites/domains/components/domain-warnings/index.jsx +++ b/client/my-sites/domains/components/domain-warnings/index.jsx @@ -20,7 +20,7 @@ import Notice from 'components/notice'; import NoticeAction from 'components/notice/notice-action'; import PendingGappsTosNotice from './pending-gapps-tos-notice'; import purchasesPaths from 'me/purchases/paths'; -import { type as domainTypes } from 'lib/domains/constants'; +import { type as domainTypes, transferStatus } from 'lib/domains/constants'; import { isSubdomain } from 'lib/domains'; import support from 'lib/url/support'; import paths from 'my-sites/domains/paths'; @@ -61,6 +61,7 @@ export class DomainWarnings extends React.PureComponent { 'unverifiedDomainsCannotManage', 'wrongNSMappedDomains', 'newDomains', + 'transferStatus', ], }; @@ -100,6 +101,7 @@ export class DomainWarnings extends React.PureComponent { this.wrongNSMappedDomains, this.newDomains, this.pendingTransfer, + this.transferStatus, ]; const validRules = this.props.ruleWhiteList.map( ruleName => this[ ruleName ] ); @@ -749,7 +751,7 @@ export class DomainWarnings extends React.PureComponent { status="is-warning" showDismiss={ false } className="domain-warnings__notice" - key="unverified-domains" + key="pending-transfer" text={ this.props.isCompact && compactNotice } > { ! this.props.isCompact && fullNotice } @@ -757,6 +759,77 @@ export class DomainWarnings extends React.PureComponent { ); }; + transferStatus = () => { + const domainInTransfer = find( + this.getDomains(), + domain => domain.type === domainTypes.TRANSFER + ); + + if ( ! domainInTransfer ) { + return null; + } + + const { translate } = this.props; + + let status = 'is-warning'; + let compactMessage = null; + let message = translate( 'Transfer in Progress' ); + + const action = ( + + { translate( 'Fix' ) } + + ); + + switch ( domainInTransfer.transferStatus ) { + case transferStatus.PENDING_OWNER: + compactMessage = translate( 'Transfer confirmation required' ); + message = translate( + 'The transfer of {{strong}}%(domain)s{{/strong}} is in progress. We are waiting ' + + 'for authorization from your current domain provider to proceed. {{a}}Learn more{{/a}}', + { + components: { + strong: , + a: , + }, + args: { domain: domainInTransfer.name }, + } + ); + break; + case transferStatus.CANCELLED: + status = 'is-error'; + compactMessage = translate( 'Domain transfer failed' ); + message = translate( + 'The transfer of {{strong}}%(domain)s{{/strong}} has been cancelled. We were unable to ' + + 'verify the email address and authorization code within 7 days of the transfer request. ' + + 'If you still want to transfer the domain you can {{a}}try again{{/a}}.', + { + components: { + strong: , + a: , + }, + args: { domain: domainInTransfer.name }, + } + ); + break; + } + + return ( + + { this.props.isCompact ? compactMessage && action : message } + + ); + }; + componentWillMount() { if ( ! this.props.domains && ! this.props.domain ) { debug( 'You need provide either "domains" or "domain" property to this component.' ); diff --git a/client/my-sites/domains/controller.jsx b/client/my-sites/domains/controller.jsx index 8ae4a17c4d4eb..998c0fa239943 100644 --- a/client/my-sites/domains/controller.jsx +++ b/client/my-sites/domains/controller.jsx @@ -6,7 +6,7 @@ import page from 'page'; import qs from 'qs'; -import i18n from 'i18n-calypso'; +import { translate } from 'i18n-calypso'; import React from 'react'; import { get } from 'lodash'; @@ -14,10 +14,10 @@ import { get } from 'lodash'; * Internal Dependencies */ import analytics from 'lib/analytics'; +import DocumentHead from 'components/data/document-head'; import route from 'lib/route'; import Main from 'components/main'; import upgradesActions from 'lib/upgrades/actions'; -import { setDocumentHeadTitle as setTitle } from 'state/document-head/actions'; import productsFactory from 'lib/products-list'; import { renderWithReduxStore } from 'lib/react-helpers'; import { canCurrentUser } from 'state/selectors'; @@ -31,7 +31,7 @@ const productsList = productsFactory(); const domainsAddHeader = ( context, next ) => { context.getSiteSelectionHeaderText = () => { - return i18n.translate( 'Select a site to add a domain' ); + return translate( 'Select a site to add a domain' ); }; next(); @@ -39,7 +39,7 @@ const domainsAddHeader = ( context, next ) => { const domainsAddRedirectHeader = ( context, next ) => { context.getSiteSelectionHeaderText = () => { - return i18n.translate( 'Select a site to add Site Redirect' ); + return translate( 'Select a site to add Site Redirect' ); }; next(); @@ -50,9 +50,6 @@ const domainSearch = context => { const DomainSearch = require( './domain-search' ); const basePath = route.sectionify( context.path ); - // FIXME: Auto-converted from the Flux setTitle action. Please use instead. - context.store.dispatch( setTitle( i18n.translate( 'Domain Search' ) ) ); - analytics.pageView.record( basePath, 'Domain Search > Domain Registration' ); // Scroll to the top @@ -61,9 +58,12 @@ const domainSearch = context => { } renderWithReduxStore( - - - , +
    + + + + +
    , document.getElementById( 'primary' ), context.store ); @@ -74,15 +74,15 @@ const siteRedirect = context => { const SiteRedirect = require( './domain-search/site-redirect' ); const basePath = route.sectionify( context.path ); - // FIXME: Auto-converted from the Flux setTitle action. Please use instead. - context.store.dispatch( setTitle( i18n.translate( 'Redirect a Site' ) ) ); - analytics.pageView.record( basePath, 'Domain Search > Site Redirect' ); renderWithReduxStore( - - - , +
    + + + + +
    , document.getElementById( 'primary' ), context.store ); @@ -93,12 +93,11 @@ const mapDomain = context => { const MapDomain = require( 'my-sites/domains/map-domain' ).default; const basePath = route.sectionify( context.path ); - // FIXME: Auto-converted from the Flux setTitle action. Please use instead. - context.store.dispatch( setTitle( i18n.translate( 'Map a Domain' ) ) ); - analytics.pageView.record( basePath, 'Domain Search > Domain Mapping' ); renderWithReduxStore(
    + + @@ -108,18 +107,27 @@ const mapDomain = context => { ); }; -const googleAppsWithRegistration = context => { +const transferDomain = context => { const CartData = require( 'components/data/cart' ); - const GoogleApps = require( 'components/upgrades/google-apps' ); + const TransferDomain = require( 'my-sites/domains/transfer-domain' ).default; + const basePath = route.sectionify( context.path ); - // FIXME: Auto-converted from the Flux setTitle action. Please use instead. - context.store.dispatch( - setTitle( - i18n.translate( 'Register %(domain)s', { - args: { domain: context.params.registerDomain }, - } ) - ) + analytics.pageView.record( basePath, 'Domain Search > Domain Transfer' ); + renderWithReduxStore( +
    + + + + +
    , + document.getElementById( 'primary' ), + context.store ); +}; + +const googleAppsWithRegistration = context => { + const CartData = require( 'components/data/cart' ); + const GoogleApps = require( 'components/upgrades/google-apps' ); const state = context.store.getState(); const siteSlug = getSelectedSiteSlug( state ) || ''; @@ -144,6 +152,11 @@ const googleAppsWithRegistration = context => { renderWithReduxStore(
    + + { message } + + ); + } +} + +export default localize( DomainTransferFlag ); diff --git a/client/my-sites/domains/domain-management/edit/card/header/index.jsx b/client/my-sites/domains/domain-management/edit/card/header/index.jsx index 145963350440a..4d81d8c85841d 100644 --- a/client/my-sites/domains/domain-management/edit/card/header/index.jsx +++ b/client/my-sites/domains/domain-management/edit/card/header/index.jsx @@ -11,6 +11,7 @@ import React from 'react'; * Internal dependencies */ import DomainPrimaryFlag from 'my-sites/domains/domain-management/components/domain/primary-flag'; +import DomainTransferFlag from 'my-sites/domains/domain-management/components/domain/transfer-flag'; import PrimaryDomainButton from './primary-domain-button'; import SectionHeader from 'components/section-header'; @@ -31,6 +32,7 @@ class Header extends React.Component { return ( + { this.props.selectedSite && ! this.props.selectedSite.jetpack && ( diff --git a/client/my-sites/domains/domain-management/edit/card/subscription-settings/index.jsx b/client/my-sites/domains/domain-management/edit/card/subscription-settings/index.jsx index 4d8dcbea004a9..5e8d40b73f1e5 100644 --- a/client/my-sites/domains/domain-management/edit/card/subscription-settings/index.jsx +++ b/client/my-sites/domains/domain-management/edit/card/subscription-settings/index.jsx @@ -28,6 +28,7 @@ class SubscriptionSettings extends React.Component { case domainTypes.MAPPED: case domainTypes.REGISTERED: case domainTypes.SITE_REDIRECT: + case domainTypes.TRANSFER: return purchasesPaths.managePurchase( this.props.siteSlug, this.props.subscriptionId ); default: diff --git a/client/my-sites/domains/domain-management/edit/index.jsx b/client/my-sites/domains/domain-management/edit/index.jsx index c439700247941..f74ba87f9d76b 100644 --- a/client/my-sites/domains/domain-management/edit/index.jsx +++ b/client/my-sites/domains/domain-management/edit/index.jsx @@ -21,6 +21,7 @@ import paths from 'my-sites/domains/paths'; import RegisteredDomain from './registered-domain'; import { registrar as registrarNames } from 'lib/domains/constants'; import SiteRedirect from './site-redirect'; +import Transfer from './transfer'; import { type as domainTypes } from 'lib/domains/constants'; import WpcomDomain from './wpcom-domain'; @@ -57,6 +58,9 @@ class Edit extends React.Component { case domainTypes.SITE_REDIRECT: return SiteRedirect; + case domainTypes.TRANSFER: + return Transfer; + case domainTypes.WPCOM: return WpcomDomain; diff --git a/client/my-sites/domains/domain-management/edit/transfer.jsx b/client/my-sites/domains/domain-management/edit/transfer.jsx new file mode 100644 index 0000000000000..fd6594af6e817 --- /dev/null +++ b/client/my-sites/domains/domain-management/edit/transfer.jsx @@ -0,0 +1,85 @@ +/** + * External dependencies + * + * @format + */ + +import React from 'react'; +import { localize } from 'i18n-calypso'; +import { connect } from 'react-redux'; + +/** + * Internal dependencies + */ +import Card from 'components/card/compact'; +import Header from './card/header'; +import Property from './card/property'; +import SubscriptionSettings from './card/subscription-settings'; +import DomainWarnings from 'my-sites/domains/components/domain-warnings'; +import { composeAnalytics, recordGoogleEvent, recordTracksEvent } from 'state/analytics/actions'; + +class Transfer extends React.PureComponent { + domainWarnings() { + return ( + + ); + } + + render() { + return ( +
    + { this.domainWarnings() } + { this.getDomainDetailsCard() } +
    + ); + } + + handlePaymentSettingsClick = () => { + this.props.paymentSettingsClick( this.props.domain ); + }; + + getDomainDetailsCard() { + const { domain, selectedSite, translate } = this.props; + + return ( +
    +
    + + + + { translate( 'Transfer' ) } + + + + +
    + ); + } +} + +const paymentSettingsClick = domain => + composeAnalytics( + recordGoogleEvent( + 'Domain Management', + `Clicked "Payment Settings" Button on a ${ domain.type } in Edit`, + 'Domain Name', + domain.name + ), + recordTracksEvent( 'calypso_domain_management_edit_payment_settings_click', { + section: domain.type, + } ) + ); + +export default connect( null, { + paymentSettingsClick, +} )( localize( Transfer ) ); diff --git a/client/my-sites/domains/domain-management/list/item.jsx b/client/my-sites/domains/domain-management/list/item.jsx index d02fec94f453d..8ba6b49899541 100644 --- a/client/my-sites/domains/domain-management/list/item.jsx +++ b/client/my-sites/domains/domain-management/list/item.jsx @@ -15,6 +15,7 @@ import { localize } from 'i18n-calypso'; */ import CompactCard from 'components/card/compact'; import DomainPrimaryFlag from 'my-sites/domains/domain-management/components/domain/primary-flag'; +import DomainTransferFlag from 'my-sites/domains/domain-management/components/domain/transfer-flag'; import Notice from 'components/notice'; import { type as domainTypes } from 'lib/domains/constants'; import Spinner from 'components/spinner'; @@ -57,6 +58,7 @@ class ListItem extends React.PureComponent { { this.props.domain.type !== 'WPCOM' && this.showDomainExpirationWarning( this.props.domain ) } + { this.busyMessage() }
    @@ -161,6 +163,9 @@ class ListItem extends React.PureComponent { case domainTypes.SITE_REDIRECT: return translate( 'Site Redirect' ); + case domainTypes.TRANSFER: + return translate( 'Transfer' ); + case domainTypes.WPCOM: return translate( 'Included with Site' ); } diff --git a/client/my-sites/domains/domain-management/style.scss b/client/my-sites/domains/domain-management/style.scss index 2a255a94fadd9..e8a44bcae2e3a 100644 --- a/client/my-sites/domains/domain-management/style.scss +++ b/client/my-sites/domains/domain-management/style.scss @@ -249,7 +249,7 @@ input[type=radio].domain-management-list-item__radio { } } -.domain-details-card { +.domain-details-card, .edit__domain-details-card { .flag { font-size: 11px; padding: 3px 10px 3px 5px; diff --git a/client/my-sites/domains/domain-search/domain-search.jsx b/client/my-sites/domains/domain-search/domain-search.jsx index a922e1deb49fd..53b8045a609e1 100644 --- a/client/my-sites/domains/domain-search/domain-search.jsx +++ b/client/my-sites/domains/domain-search/domain-search.jsx @@ -63,6 +63,11 @@ class DomainSearch extends Component { page( '/checkout/' + this.props.selectedSiteSlug ); }; + handleAddTransfer = domain => { + upgradesActions.addItem( cartItems.domainTransfer( { domain } ) ); + page( '/checkout/' + this.props.selectedSiteSlug ); + }; + componentWillMount() { this.checkSiteIsUpgradeable( this.props ); } @@ -145,9 +150,10 @@ class DomainSearch extends Component { onDomainsAvailabilityChange={ this.handleDomainsAvailabilityChange } onAddDomain={ this.handleAddRemoveDomain } onAddMapping={ this.handleAddMapping } + onAddTransfer={ this.handleAddTransfer } cart={ this.props.cart } selectedSite={ selectedSite } - offerMappingOption + offerUnavailableOption basePath={ this.props.basePath } products={ this.props.productsList } /> diff --git a/client/my-sites/domains/index.js b/client/my-sites/domains/index.js index 44a8b2bc3a169..5b6f9f73313bc 100644 --- a/client/my-sites/domains/index.js +++ b/client/my-sites/domains/index.js @@ -164,6 +164,14 @@ export default function() { controller.sites ); + page( + '/domains/add/transfer', + controller.siteSelection, + domainsController.domainsAddHeader, + controller.jetPackWarning, + controller.sites + ); + page( '/domains/add/site-redirect', controller.siteSelection, @@ -218,6 +226,15 @@ export default function() { controller.jetPackWarning, domainsController.siteRedirect ); + + page( + '/domains/add/transfer/:domain', + controller.siteSelection, + controller.navigation, + domainsController.redirectIfNoSite( '/domains/add/transfer' ), + controller.jetPackWarning, + domainsController.transferDomain + ); } page( '/domains', controller.siteSelection, controller.sites ); diff --git a/client/my-sites/domains/transfer-domain/index.jsx b/client/my-sites/domains/transfer-domain/index.jsx new file mode 100644 index 0000000000000..afa4623dcf3ac --- /dev/null +++ b/client/my-sites/domains/transfer-domain/index.jsx @@ -0,0 +1,136 @@ +/** + * External dependencies + * + * @format + */ +import page from 'page'; +import PropTypes from 'prop-types'; +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { localize } from 'i18n-calypso'; + +/** + * Internal dependencies + */ +import HeaderCake from 'components/header-cake'; +import TransferDomainStep from 'components/domains/transfer-domain-step'; +import { DOMAINS_WITH_PLANS_ONLY } from 'state/current-user/constants'; +import { cartItems } from 'lib/cart-values'; +import upgradesActions from 'lib/upgrades/actions'; +import Notice from 'components/notice'; +import { currentUserHasFlag } from 'state/current-user/selectors'; +import { isSiteUpgradeable } from 'state/selectors'; +import { getSelectedSite, getSelectedSiteId, getSelectedSiteSlug } from 'state/ui/selectors'; +import QueryProductsList from 'components/data/query-products-list'; +import { getProductsList } from 'state/products-list/selectors'; + +export class TransferDomain extends Component { + static propTypes = { + initialQuery: PropTypes.string, + query: PropTypes.string, + cart: PropTypes.object.isRequired, + domainsWithPlansOnly: PropTypes.bool.isRequired, + isSiteUpgradeable: PropTypes.bool, + productsList: PropTypes.object.isRequired, + selectedSite: PropTypes.object, + selectedSiteId: PropTypes.number, + selectedSiteSlug: PropTypes.string, + translate: PropTypes.func.isRequired, + }; + + state = { + errorMessage: null, + }; + + goBack = () => { + const { selectedSite, selectedSiteSlug } = this.props; + + if ( ! selectedSite ) { + page( '/domains/add' ); + return; + } + + page( '/domains/add/' + selectedSiteSlug ); + }; + + handleRegisterDomain = suggestion => { + const { selectedSiteSlug } = this.props; + + upgradesActions.addItem( + cartItems.domainRegistration( { + productSlug: suggestion.product_slug, + domain: suggestion.domain_name, + } ) + ); + + page( '/checkout/' + selectedSiteSlug ); + }; + + handleTransferDomain = domain => { + const { selectedSiteSlug } = this.props; + + this.setState( { errorMessage: null } ); + + upgradesActions.addItem( cartItems.domainTransfer( { domain } ) ); + + page( '/checkout/' + selectedSiteSlug ); + }; + + componentWillMount() { + this.checkSiteIsUpgradeable( this.props ); + } + + componentWillReceiveProps( nextProps ) { + this.checkSiteIsUpgradeable( nextProps ); + } + + checkSiteIsUpgradeable( props ) { + if ( props.selectedSite && ! props.isSiteUpgradeable ) { + page.redirect( '/domains/add/transfer' ); + } + } + + render() { + const { + cart, + domainsWithPlansOnly, + initialQuery, + productsList, + selectedSite, + translate, + } = this.props; + + const { errorMessage } = this.state; + + return ( + + + + { translate( 'Use My Own Domain' ) } + + { errorMessage && } + + + + ); + } +} + +export default connect( state => ( { + selectedSite: getSelectedSite( state ), + selectedSiteId: getSelectedSiteId( state ), + selectedSiteSlug: getSelectedSiteSlug( state ), + domainsWithPlansOnly: currentUserHasFlag( state, DOMAINS_WITH_PLANS_ONLY ), + isSiteUpgradeable: isSiteUpgradeable( state, getSelectedSiteId( state ) ), + productsList: getProductsList( state ), +} ) )( localize( TransferDomain ) ); diff --git a/client/my-sites/plugins/disconnect-jetpack/disconnect-jetpack-button.jsx b/client/my-sites/plugins/disconnect-jetpack/disconnect-jetpack-button.jsx index e6936197e9be3..5ced68bd68e7a 100644 --- a/client/my-sites/plugins/disconnect-jetpack/disconnect-jetpack-button.jsx +++ b/client/my-sites/plugins/disconnect-jetpack/disconnect-jetpack-button.jsx @@ -13,32 +13,33 @@ import { connect } from 'react-redux'; /** * Internal dependencies */ -import Button from 'components/button'; import DisconnectJetpackDialog from 'blocks/disconnect-jetpack/dialog'; +import Button from 'components/button'; import QuerySitePlans from 'components/data/query-site-plans'; -import { recordGoogleEvent } from 'state/analytics/actions'; +import { isEnabled } from 'config'; +import { + recordGoogleEvent as recordGoogleEventAction, + recordTracksEvent as recordTracksEventAction, +} from 'state/analytics/actions'; class DisconnectJetpackButton extends Component { - constructor( props ) { - super( props ); - this.state = { dialogVisible: false }; - } + state = { dialogVisible: false }; - handleClick = event => { - event.preventDefault(); - const { isMock, recordGoogleEvent: recordGAEvent } = this.props; + handleClick = () => { + const { isMock, recordGoogleEvent, recordTracksEvent } = this.props; if ( isMock ) { return; } this.setState( { dialogVisible: true } ); - recordGAEvent( 'Jetpack', 'Clicked To Open Disconnect Jetpack Dialog' ); + recordGoogleEvent( 'Jetpack', 'Clicked To Open Disconnect Jetpack Dialog' ); + recordTracksEvent( 'calypso_jetpack_disconnect_start' ); }; hideDialog = () => { - const { recordGoogleEvent: recordGAEvent } = this.props; + const { recordGoogleEvent } = this.props; this.setState( { dialogVisible: false } ); - recordGAEvent( 'Jetpack', 'Clicked To Cancel Disconnect Jetpack Dialog' ); + recordGoogleEvent( 'Jetpack', 'Clicked To Cancel Disconnect Jetpack Dialog' ); }; render() { @@ -63,6 +64,11 @@ class DisconnectJetpackButton extends Component { /* eslint-disable wpcalypso/jsx-classname-namespace */ className="disconnect-jetpack-button" compact + href={ + isEnabled( 'manage/site-settings/disconnect-flow' ) ? ( + '/settings/disconnect-site/' + site.slug + ) : null + } id={ `disconnect-jetpack-${ site.ID }` } onClick={ this.handleClick } scary @@ -72,13 +78,15 @@ class DisconnectJetpackButton extends Component { context: 'Jetpack: Action user takes to disconnect Jetpack site from .com', } ) } - + { ! isEnabled( 'manage/site-settings/disconnect-flow' ) && ( + + ) } ); } @@ -92,10 +100,14 @@ DisconnectJetpackButton.propTypes = { isMock: PropTypes.bool, text: PropTypes.string, recordGoogleEvent: PropTypes.func.isRequired, + recordTracksEvent: PropTypes.func.isRequired, }; DisconnectJetpackButton.defaultProps = { linkDisplay: true, }; -export default connect( null, { recordGoogleEvent } )( localize( DisconnectJetpackButton ) ); +export default connect( null, { + recordGoogleEvent: recordGoogleEventAction, + recordTracksEvent: recordTracksEventAction, +} )( localize( DisconnectJetpackButton ) ); diff --git a/client/my-sites/post-type-list/index.jsx b/client/my-sites/post-type-list/index.jsx index b20b1c23f6998..5cb0c69998842 100644 --- a/client/my-sites/post-type-list/index.jsx +++ b/client/my-sites/post-type-list/index.jsx @@ -19,10 +19,13 @@ import { getSelectedSiteId } from 'state/ui/selectors'; import { isRequestingSitePostsForQueryIgnoringPage, getSitePostsForQueryIgnoringPage, + getSitePostsFoundForQuery, getSitePostsLastPageForQuery, } from 'state/posts/selectors'; +import ListEnd from 'components/list-end'; import PostItem from 'blocks/post-item'; import PostTypeListEmptyContent from './empty-content'; +import PostTypeListMaxPagesNotice from './max-pages-notice'; /** * Constants @@ -30,6 +33,9 @@ import PostTypeListEmptyContent from './empty-content'; // When this many pixels or less are below the viewport, begin loading the next // page of items. const LOAD_NEXT_PAGE_THRESHOLD_PIXELS = 400; +// The maximum number of pages of results that can be displayed in "All My +// Sites" (API endpoint limitation). +const MAX_ALL_SITES_PAGES = 10; class PostTypeList extends Component { static propTypes = { @@ -43,7 +49,9 @@ class PostTypeList extends Component { siteId: PropTypes.number, posts: PropTypes.array, isRequestingPosts: PropTypes.bool, - lastPage: PropTypes.number, + totalPostCount: PropTypes.number, + totalPageCount: PropTypes.number, + lastPageToRequest: PropTypes.number, }; constructor() { @@ -103,14 +111,18 @@ class PostTypeList extends Component { return 1; } - const query = this.props.query || {}; - const postsPerPage = query.number || DEFAULT_POST_QUERY.number; + const postsPerPage = this.getPostsPerPageCount(); const pageCount = Math.ceil( posts.length / postsPerPage ); // Avoid making more than 5 concurrent requests on page load. return Math.min( pageCount, 5 ); } + getPostsPerPageCount() { + const query = this.props.query || {}; + return query.number || DEFAULT_POST_QUERY.number; + } + getScrollTop() { const { scrollContainer } = this.props; if ( ! scrollContainer ) { @@ -122,31 +134,53 @@ class PostTypeList extends Component { return scrollContainer.scrollTop; } + hasListFullyLoaded() { + const { lastPageToRequest, isRequestingPosts } = this.props; + const { maxRequestedPage } = this.state; + + return ! isRequestingPosts && maxRequestedPage >= lastPageToRequest; + } + maybeLoadNextPage() { - const { scrollContainer, lastPage, isRequestingPosts } = this.props; - if ( ! scrollContainer ) { + const { scrollContainer, lastPageToRequest, isRequestingPosts } = this.props; + const { maxRequestedPage } = this.state; + if ( ! scrollContainer || isRequestingPosts || maxRequestedPage >= lastPageToRequest ) { return; } + const scrollTop = this.getScrollTop(); const { scrollHeight, clientHeight } = scrollContainer; + const pixelsBelowViewport = scrollHeight - scrollTop - clientHeight; if ( typeof scrollTop !== 'number' || typeof scrollHeight !== 'number' || - typeof clientHeight !== 'number' + typeof clientHeight !== 'number' || + pixelsBelowViewport > LOAD_NEXT_PAGE_THRESHOLD_PIXELS ) { return; } - const pixelsBelowViewport = scrollHeight - scrollTop - clientHeight; - const { maxRequestedPage } = this.state; - if ( - pixelsBelowViewport <= LOAD_NEXT_PAGE_THRESHOLD_PIXELS && - maxRequestedPage < lastPage && - ! isRequestingPosts - ) { - this.setState( { - maxRequestedPage: maxRequestedPage + 1, - } ); + + this.setState( { maxRequestedPage: maxRequestedPage + 1 } ); + } + + renderListEnd() { + return ; + } + + renderMaxPagesNotice() { + const { siteId, totalPageCount, totalPostCount } = this.props; + const isTruncated = + null === siteId && this.hasListFullyLoaded() && totalPageCount > MAX_ALL_SITES_PAGES; + + if ( ! isTruncated ) { + return null; } + + const displayedPosts = this.getPostsPerPageCount() * MAX_ALL_SITES_PAGES; + + return ( + + ); } renderPlaceholder() { @@ -169,7 +203,7 @@ class PostTypeList extends Component { } render() { - const { query, siteId, posts, isRequestingPosts, lastPage } = this.props; + const { query, siteId, posts, isRequestingPosts } = this.props; const { maxRequestedPage } = this.state; const isLoadedAndEmpty = query && posts && ! posts.length && ! isRequestingPosts; const classes = classnames( 'post-type-list', { @@ -186,7 +220,8 @@ class PostTypeList extends Component { { isLoadedAndEmpty && ( ) } - { ( maxRequestedPage < lastPage || isRequestingPosts ) && this.renderPlaceholder() } + { this.renderMaxPagesNotice() } + { this.hasListFullyLoaded() ? this.renderListEnd() : this.renderPlaceholder() }
    ); } @@ -194,12 +229,17 @@ class PostTypeList extends Component { export default connect( ( state, ownProps ) => { const siteId = getSelectedSiteId( state ); - const lastPage = getSitePostsLastPageForQuery( state, siteId, ownProps.query ); + + const totalPageCount = getSitePostsLastPageForQuery( state, siteId, ownProps.query ); + const lastPageToRequest = + siteId === null ? Math.min( MAX_ALL_SITES_PAGES, totalPageCount ) : totalPageCount; return { siteId, posts: getSitePostsForQueryIgnoringPage( state, siteId, ownProps.query ), isRequestingPosts: isRequestingSitePostsForQueryIgnoringPage( state, siteId, ownProps.query ), - lastPage, + totalPostCount: getSitePostsFoundForQuery( state, siteId, ownProps.query ), + totalPageCount, + lastPageToRequest, }; } )( PostTypeList ); diff --git a/client/my-sites/post-type-list/max-pages-notice.jsx b/client/my-sites/post-type-list/max-pages-notice.jsx new file mode 100644 index 0000000000000..fd35f41c77f82 --- /dev/null +++ b/client/my-sites/post-type-list/max-pages-notice.jsx @@ -0,0 +1,67 @@ +/** + * External dependencies + * + * @format + */ + +import PropTypes from 'prop-types'; +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { localize } from 'i18n-calypso'; + +/** + * Internal dependencies + */ +import { setLayoutFocus } from 'state/ui/layout-focus/actions'; +import { recordTracksEvent } from 'state/analytics/actions'; + +class PostTypeListMaxPagesNotice extends Component { + static propTypes = { + displayedPosts: PropTypes.number, + totalPosts: PropTypes.number, + }; + + componentWillMount() { + this.props.recordTracksEvent( 'calypso_post_type_list_max_pages_view' ); + } + + focusSiteSelector = event => { + event.preventDefault(); + + this.props.setLayoutFocus( 'sites' ); + }; + + render() { + const { displayedPosts, totalPosts, translate } = this.props; + + return ( + + ); + } +} + +export default connect( null, { recordTracksEvent, setLayoutFocus } )( + localize( PostTypeListMaxPagesNotice ) +); diff --git a/client/my-sites/post-type-list/style.scss b/client/my-sites/post-type-list/style.scss index 6bab3e0645ec6..9dcb3577594c9 100644 --- a/client/my-sites/post-type-list/style.scss +++ b/client/my-sites/post-type-list/style.scss @@ -46,3 +46,17 @@ max-height: 100%; max-width: none; } + + +.post-type-list__max-pages-notice { + text-align: center; + margin: 16px 0; + font-size: 14px; + color: $gray-text-min; +} + +a.post-type-list__max-pages-notice-link { + cursor: pointer; + color: $gray-text-min; + text-decoration: underline; +} diff --git a/client/my-sites/site-settings/disconnect-site/missing-feature.jsx b/client/my-sites/site-settings/disconnect-site/missing-feature.jsx index 3d8b12088d416..53173cf70186e 100644 --- a/client/my-sites/site-settings/disconnect-site/missing-feature.jsx +++ b/client/my-sites/site-settings/disconnect-site/missing-feature.jsx @@ -59,13 +59,17 @@ class MissingFeature extends PureComponent { /> + { + isPressable + ? + : + } +
    + +); + +export default localize( SetupTos ); diff --git a/client/my-sites/site-settings/jetpack-credentials/credentials-setup-flow/style.scss b/client/my-sites/site-settings/jetpack-credentials/credentials-setup-flow/style.scss new file mode 100644 index 0000000000000..ec0a4de8bd92b --- /dev/null +++ b/client/my-sites/site-settings/jetpack-credentials/credentials-setup-flow/style.scss @@ -0,0 +1,57 @@ +.credentials-setup-flow { + cursor: pointer; +} + +.credentials-setup-flow__header-gridicon { + display: inline-block; + vertical-align: middle; + margin-right: 10px; + color: $gray; +} + +.credentials-setup-flow__header-text { + display: inline-block; + vertical-align: middle; + width: 85%; +} + +.credentials-setup-flow__header-text-title { + font-size: 1.6rem; +} + +.credentials-setup-flow__header-text-description { + font-size: 1.3rem; + font-style: italic; +} + +.credentials-setup-flow__tos-gridicon { + display: inline-block; + vertical-align: top; + margin-right: 10px; + color: $blue-wordpress; +} + +.credentials-setup-flow__tos-text { + display: inline-block; + vertical-align: top; + width: 85%; +} + +.credentials-setup-flow__tos-buttons { + display: block; + text-align: right; +} + +.credentials-setup-flow__tos-buttons .is-borderless { + margin-right: 15px; +} + +.credentials-setup-flow__footer-popover-link { + cursor: pointer; +} + +.credentials-setup-flow__footer-popover-icon { + position: relative; + top: 3px; + left: -6px; +} diff --git a/client/my-sites/site-settings/jetpack-credentials/index.jsx b/client/my-sites/site-settings/jetpack-credentials/index.jsx new file mode 100644 index 0000000000000..e0aa451748623 --- /dev/null +++ b/client/my-sites/site-settings/jetpack-credentials/index.jsx @@ -0,0 +1,109 @@ +/** + * External dependencies + */ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { localize } from 'i18n-calypso'; +import { connect } from 'react-redux'; + +/** + * Internal dependencies + */ +import CompactCard from 'components/card/compact'; +import CredentialsSetupFlow from './credentials-setup-flow/index'; +import CredentialsConfigured from './credentials-configured/index'; +import Gridicon from 'gridicons'; +import QueryRewindStatus from 'components/data/query-rewind-status'; +import QueryJetpackCredentials from 'components/data/query-jetpack-credentials'; +import { isRewindActive } from 'state/selectors'; +import { getSelectedSiteId } from 'state/ui/selectors'; +import { + getJetpackCredentials, + isUpdatingJetpackCredentials, + hasMainCredentials, + isSitePressable, + getCredentialsAutoConfigStatus +} from 'state/selectors'; +import { + updateCredentials as updateCredentialsAction, + autoConfigCredentials as autoConfigCredentialsAction +} from 'state/jetpack/credentials/actions'; + +class Backups extends Component { + static propTypes = { + autoConfigStatus: PropTypes.string, + formIsSubmitting: PropTypes.bool, + hasMainCredentials: PropTypes.bool, + mainCredentials: PropTypes.object, + isPressable: PropTypes.bool, + isRewindActive: PropTypes.bool, + siteId: PropTypes.number.isRequired + }; + + render() { + const { + autoConfigStatus, + hasMainCredentials, // eslint-disable-line no-shadow + isPressable, + isRewindActive, // eslint-disable-line no-shadow + translate, + formIsSubmitting, + updateCredentials, + siteId, + autoConfigCredentials + } = this.props; + + return ( +
    + + + { isRewindActive && ( + + { translate( 'Backups and restores' ) } + { hasMainCredentials && ( + + + { translate( 'Connected' ) } + + ) } + + ) } + + { isRewindActive && ! hasMainCredentials && ( + + ) } + + { isRewindActive && hasMainCredentials && ( + + ) } +
    + ); + } +} + +export default connect( + ( state ) => { + const siteId = getSelectedSiteId( state ); + const credentials = getJetpackCredentials( state, siteId, 'main' ); + + return { + autoConfigStatus: getCredentialsAutoConfigStatus( state, siteId ), + formIsSubmitting: isUpdatingJetpackCredentials( state, siteId ), + hasMainCredentials: hasMainCredentials( state, siteId ), + mainCredentials: credentials, + isPressable: isSitePressable( state, siteId ), + isRewindActive: isRewindActive( state, siteId ), + siteId, + }; + }, { + autoConfigCredentials: autoConfigCredentialsAction, + updateCredentials: updateCredentialsAction, + } +)( localize( Backups ) ); diff --git a/client/my-sites/site-settings/jetpack-credentials/style.scss b/client/my-sites/site-settings/jetpack-credentials/style.scss new file mode 100644 index 0000000000000..400aff9f52e03 --- /dev/null +++ b/client/my-sites/site-settings/jetpack-credentials/style.scss @@ -0,0 +1,22 @@ +.jetpack-credentials { + margin-bottom: 15px; +} + +.jetpack-credentials .foldable-card.card.is-expanded { + margin: 0; +} + +.jetpack-credentials__connected { + float: right; + background: $alert-green; + padding: 0 8px; + margin: -4px; + font-size: 1.3rem; + color: $white; +} + +.jetpack-credentials__connected-checkmark { + position: relative; + top: 3px; + margin-right: 3px; +} diff --git a/client/my-sites/site-settings/manage-connection/disconnect-site-link.jsx b/client/my-sites/site-settings/manage-connection/disconnect-site-link.jsx index 13577480ba60e..fa903b7af751b 100644 --- a/client/my-sites/site-settings/manage-connection/disconnect-site-link.jsx +++ b/client/my-sites/site-settings/manage-connection/disconnect-site-link.jsx @@ -13,9 +13,12 @@ import { localize } from 'i18n-calypso'; */ import DisconnectJetpackDialog from 'blocks/disconnect-jetpack/dialog'; import QuerySitePlans from 'components/data/query-site-plans'; +import { isEnabled } from 'config'; import SiteToolsLink from 'my-sites/site-settings/site-tools/link'; +import { getSiteSlug } from 'state/sites/selectors'; import { getSelectedSiteId } from 'state/ui/selectors'; import { isSiteAutomatedTransfer } from 'state/selectors'; +import { recordTracksEvent } from 'state/analytics/actions'; class DisconnectSiteLink extends Component { state = { @@ -23,11 +26,15 @@ class DisconnectSiteLink extends Component { }; handleClick = event => { - event.preventDefault(); + if ( ! isEnabled( 'manage/site-settings/disconnect-flow' ) ) { + event.preventDefault(); + } this.setState( { dialogVisible: true, } ); + + this.props.recordTracksEvent( 'calypso_jetpack_disconnect_start' ); }; handleHideDialog = () => { @@ -37,7 +44,7 @@ class DisconnectSiteLink extends Component { }; render() { - const { isAutomatedTransfer, siteId, translate } = this.props; + const { isAutomatedTransfer, siteId, siteSlug, translate } = this.props; if ( ! siteId || isAutomatedTransfer ) { return null; @@ -48,7 +55,13 @@ class DisconnectSiteLink extends Component { - + { ! isEnabled( 'manage/site-settings/disconnect-flow' ) && ( + + ) }
    ); } } -export default connect( state => { - const siteId = getSelectedSiteId( state ); +export default connect( + state => { + const siteId = getSelectedSiteId( state ); - return { - isAutomatedTransfer: isSiteAutomatedTransfer( state, siteId ), - siteId, - }; -} )( localize( DisconnectSiteLink ) ); + return { + isAutomatedTransfer: isSiteAutomatedTransfer( state, siteId ), + siteId, + siteSlug: getSiteSlug( state, siteId ), + }; + }, + { recordTracksEvent } +)( localize( DisconnectSiteLink ) ); diff --git a/client/my-sites/site-settings/press-this/link.jsx b/client/my-sites/site-settings/press-this/link.jsx index f8454864187a9..02a58823b617c 100644 --- a/client/my-sites/site-settings/press-this/link.jsx +++ b/client/my-sites/site-settings/press-this/link.jsx @@ -66,24 +66,6 @@ class PressThisLink extends React.Component { site: PropTypes.object.isRequired, }; - /** - * Legacy press-this pointing to wp-admin. This will be - * deprecated and removed soon. - * @return {string} javascript pseudo-protocol link - */ - pressThisWPAdmin() { - const site = this.props.site; - const adminURL = site && site.options && site.options.admin_url; - return [ - /* eslint-disable max-len */ - "javascript:var d=document,w=window,e=w.getSelection,k=d.getSelection,x=d.selection,s=(e?e():(k)?k():(x?x.createRange().text:0)),f='", // eslint-disable-line no-script-url - adminURL, - "press-this.php',l=d.location,e=encodeURIComponent,u=f+'?u='+e(l.href)+'&t='+e(d.title)+'&s='+e(s)+'&v=4';a=function(){", - "if(!w.open(u,'t','toolbar=0,resizable=1,scrollbars=1,status=1,width=720,height=570'))l.href=u;};if (/Firefox/.test(navigator.userAgent)) setTimeout(a, 0); else a();void(0)", - /* eslint-enable max-len */ - ].join( '' ); - } - /** * generate press-this link pointing to current environment * @return {string} javascript pseudo-protocol link diff --git a/client/my-sites/site-settings/settings-security/main.jsx b/client/my-sites/site-settings/settings-security/main.jsx index 05794387d32df..8b29e044dee2a 100644 --- a/client/my-sites/site-settings/settings-security/main.jsx +++ b/client/my-sites/site-settings/settings-security/main.jsx @@ -12,6 +12,7 @@ import { connect } from 'react-redux'; /** * Internal dependencies */ +import config from 'config'; import Main from 'components/main'; import DocumentHead from 'components/data/document-head'; import SidebarNavigation from 'my-sites/sidebar-navigation'; @@ -23,6 +24,7 @@ import JetpackDevModeNotice from 'my-sites/site-settings/jetpack-dev-mode-notice import JetpackMonitor from 'my-sites/site-settings/form-jetpack-monitor'; import JetpackManageErrorPage from 'my-sites/jetpack-manage-error-page'; import Placeholder from 'my-sites/site-settings/placeholder'; +import Backups from 'my-sites/site-settings/jetpack-credentials'; const SiteSettingsSecurity = ( { site, siteId, siteIsJetpack, translate } ) => { if ( ! site ) { @@ -64,6 +66,7 @@ const SiteSettingsSecurity = ( { site, siteId, siteIsJetpack, translate } ) => { + { config.isEnabled( 'jetpack/credentials' ) && } diff --git a/client/my-sites/stats/activity-log-banner/error-banner.jsx b/client/my-sites/stats/activity-log-banner/error-banner.jsx index 65d93575a3b1f..dc9ca4ba90ce2 100644 --- a/client/my-sites/stats/activity-log-banner/error-banner.jsx +++ b/client/my-sites/stats/activity-log-banner/error-banner.jsx @@ -21,7 +21,7 @@ class ErrorBanner extends PureComponent { failureReason: PropTypes.string.isRequired, requestRestore: PropTypes.func.isRequired, siteId: PropTypes.number.isRequired, - timestamp: PropTypes.number.isRequired, + timestamp: PropTypes.string.isRequired, // connect dismissRewindRestoreProgress: PropTypes.func.isRequired, diff --git a/client/my-sites/stats/activity-log-banner/progress-banner.jsx b/client/my-sites/stats/activity-log-banner/progress-banner.jsx index a3c4a60b248da..5adf8715ab4a3 100644 --- a/client/my-sites/stats/activity-log-banner/progress-banner.jsx +++ b/client/my-sites/stats/activity-log-banner/progress-banner.jsx @@ -13,6 +13,25 @@ import ActivityLogBanner from './index'; import ProgressBar from 'components/progress-bar'; import QueryRewindRestoreStatus from 'components/data/query-rewind-restore-status'; +/** + * Normalize timestamp values + * + * Some timestamps are in seconds instead + * of in milliseconds and this will make + * sure they are all reported in ms + * + * The chosen comparison date is older than + * WordPress so no backups should already + * exist prior to that date 😉 + * + * @param {Number} ts timestamp in 's' or 'ms' + * @returns {Number} timestamp in 'ms' + */ +const ms = ts => + ts < 946702800000 // Jan 1, 2001 @ 00:00:00 + ? ts * 1000 // convert s -> ms + : ts; + function ProgressBanner( { applySiteOffset, moment, @@ -42,17 +61,13 @@ function ProgressBanner( { { translate( "We're in the process of restoring your site back to %s. " + "You'll be notified once it's complete.", - { args: applySiteOffset( moment.utc( timestamp ) ).format( 'LLLL' ) } + { args: applySiteOffset( moment.utc( ms( timestamp ) ) ).format( 'LLLL' ) } ) }

    { restoreStatusDescription } - + { 'running' === status && }
    ); @@ -63,7 +78,7 @@ ProgressBanner.propTypes = { percent: PropTypes.number.isRequired, siteId: PropTypes.number, status: PropTypes.oneOf( [ 'queued', 'running' ] ).isRequired, - timestamp: PropTypes.number.isRequired, + timestamp: PropTypes.string.isRequired, }; export default localize( ProgressBanner ); diff --git a/client/my-sites/stats/activity-log-banner/success-banner.jsx b/client/my-sites/stats/activity-log-banner/success-banner.jsx index 7f7a26750afb5..1ad10c99dbc71 100644 --- a/client/my-sites/stats/activity-log-banner/success-banner.jsx +++ b/client/my-sites/stats/activity-log-banner/success-banner.jsx @@ -21,7 +21,7 @@ class SuccessBanner extends PureComponent { applySiteOffset: PropTypes.func.isRequired, siteId: PropTypes.number.isRequired, siteUrl: PropTypes.string.isRequired, - timestamp: PropTypes.number.isRequired, + timestamp: PropTypes.string.isRequired, // connect dismissRewindRestoreProgress: PropTypes.func.isRequired, diff --git a/client/my-sites/stats/activity-log-day/index.jsx b/client/my-sites/stats/activity-log-day/index.jsx index baa51c7216911..6ccd54046e28b 100644 --- a/client/my-sites/stats/activity-log-day/index.jsx +++ b/client/my-sites/stats/activity-log-day/index.jsx @@ -6,11 +6,11 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import classnames from 'classnames'; +import classNames from 'classnames'; import Gridicon from 'gridicons'; import { connect } from 'react-redux'; import { localize } from 'i18n-calypso'; -import { flatMap, get, isEmpty } from 'lodash'; +import { findIndex, get, isEmpty } from 'lodash'; /** * Internal dependencies @@ -29,6 +29,30 @@ import { rewriteStream } from 'state/activity-log/log/is-discarded'; */ const DAY_IN_MILLISECONDS = 1000 * 60 * 60 * 24; +/** + * Separates events into those before, at, and after a rewind operation + * + * @param {Array} logs activity log items + * @param {Number} activityId selected rewind operation + * @returns {[Array, ?Object, Array]} [ before, above, after ] + */ +const splitByRewind = ( logs, activityId ) => { + const rewindIndex = findIndex( logs, log => log.activityId === activityId ); + + // no dialog is open + if ( -1 === rewindIndex ) { + return [ logs, null, [] ]; + } + + // first event is rewind + if ( 0 === rewindIndex ) { + return [ [], null, logs ]; + } + + // everything else is standard + return [ logs.slice( 0, rewindIndex - 1 ), logs[ rewindIndex - 1 ], logs.slice( rewindIndex ) ]; +}; + class ActivityLogDay extends Component { static propTypes = { applySiteOffset: PropTypes.func.isRequired, @@ -133,8 +157,8 @@ class ActivityLogDay extends Component { primary={ 'primary' === type } > {' '} - { this.props.translate( 'Rewind {{em}}to this day{{/em}}', { - components: { em: }, + { this.props.translate( 'Rewind {{span}}to this day{{/span}}', { + components: { span: }, } ) } ); @@ -191,62 +215,58 @@ class ActivityLogDay extends Component { tsEndOfSiteDay, } = this.props; - const hasLogs = ! isEmpty( logs ); const rewindHere = this.state.rewindHere; const dayExpanded = this.state.dayExpanded ? true : rewindHere; - const hasConfirmDialog = - hasLogs && - logs.some( - ( { activityId, activityTs } ) => - activityId === requestedRestoreActivityId && - ( tsEndOfSiteDay - DAY_IN_MILLISECONDS <= activityTs && activityTs <= tsEndOfSiteDay ) - ); + const hasConfirmDialog = logs.some( + ( { activityId, activityTs } ) => + activityId === requestedRestoreActivityId && + ( tsEndOfSiteDay - DAY_IN_MILLISECONDS <= activityTs && activityTs <= tsEndOfSiteDay ) + ); - const rewindButton = hasLogs - ? this.renderRewindButton( hasConfirmDialog ? '' : 'primary' ) - : null; + const rewindButton = this.renderRewindButton( hasConfirmDialog ? '' : 'primary' ); + const [ newer, above, older ] = splitByRewind( + rewriteStream( logs ), + requestedRestoreActivityId + ); + + const LogItem = ( { log, hasBreak } ) => ( + + ); return ( -
    - - { hasLogs && - flatMap( rewriteStream( logs ), log => [ - log.activityId === requestedRestoreActivityId && rewindConfirmDialog, - , - ] ) } - -
    + { newer.map( log => ) } + { above && } + { older.length > 0 && rewindConfirmDialog } + { older.map( log => ) } + ); } } export default connect( - ( state, { tsEndOfSiteDay, siteId } ) => { - const now = Date.now(); + ( state, { siteId } ) => { return { - isToday: now <= tsEndOfSiteDay && tsEndOfSiteDay - DAY_IN_MILLISECONDS <= now, requestedRewind: getRequestedRewind( state, siteId ), }; }, diff --git a/client/my-sites/stats/activity-log-day/style.scss b/client/my-sites/stats/activity-log-day/style.scss index 22eafe3250bba..5ba8eef7e09a7 100644 --- a/client/my-sites/stats/activity-log-day/style.scss +++ b/client/my-sites/stats/activity-log-day/style.scss @@ -1,77 +1,21 @@ // Activity Log .activity-log-day { - position: relative; - z-index: 2; + background: none; + box-shadow: none; - .card { - background: transparent; - - .foldable-card__content { - padding: 0 0 16px; - background: transparent; - } - } - - &.is-empty { - .card { - box-shadow: none; - } - - .foldable-card__header { - background: $gray-light; - min-height: initial; - padding-bottom: 4px; - padding-top: 4px; - } - } - - .foldable-card__header { + > .foldable-card__header { background: $white; - - .foldable-card__secondary { - flex: 2; - } - } - - .foldable-card__main { - @include breakpoint( "<480px" ) { - flex: 3 1; - } - } - - .foldable-card.card.is-expanded { - box-shadow: none; - margin: 0; - - .foldable-card__header { - box-shadow: 0 0 0 1px transparentize( lighten( $gray, 20% ), .5 ), + box-shadow: 0 0 0 1px transparentize( lighten( $gray, 20% ), .5 ), 0 1px 2px lighten( $gray, 30% ); - } } -} - -.activity-log-day__day { - font-weight: 600; -} - -.activity-log-day__rewind-button { - em { - font-style: normal; - @include breakpoint( "<960px" ) { - display: none; - } + > .foldable-card__content.foldable-card__content { // Sad panda specificity override + padding: 24px 0 16px; + background: transparent; } } -.activity-log-day__events { - font-size: 12px; - color: $gray; -} - .activity-log-day__placeholder { - @extend .activity-log-day; - .activity-log-day__day, .activity-log-day__events { @include placeholder(); @@ -87,43 +31,17 @@ } } -.activity-log-day, .activity-log-item { - position: relative; - - &:before { - content: ""; - position: absolute; - top: 73px; - height: 16px; - left: 33px; - width: 2px; - background-color: lighten( $gray, 20% ); - - @include breakpoint( "<480px" ) { - left: 29px; - } - } -} - -.activity-log-day.is-empty:before { - top: 48px; -} - -.activity-log-day:last-of-type:before { - width: 0; +.activity-log-day__day { + font-weight: 600; } -.activity-log-item:before { - bottom: -16px; - height: auto; - - @include breakpoint( "<480px" ) { - left: 21px; +.activity-log-day__rewind-button-extra-text { + @include breakpoint( "<960px" ) { + display: none; } } -.activity-log-item__restore-confirm:before { - bottom: 0; - height: auto; - top: 57px; -} \ No newline at end of file +.activity-log-day__events { + font-size: 12px; + color: $gray-text-min; +} diff --git a/client/my-sites/stats/activity-log-item/style.scss b/client/my-sites/stats/activity-log-item/style.scss index b8080387e34a9..931e3af521693 100644 --- a/client/my-sites/stats/activity-log-item/style.scss +++ b/client/my-sites/stats/activity-log-item/style.scss @@ -1,39 +1,18 @@ .activity-log-item { display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: flex-start; - align-content: flex-start; - align-items: center; position: relative; @include breakpoint( "<480px" ) { margin-left: 8px; } - // TODO: Remove when foldable cards become "expandable" - .foldable-card__header.is-clickable { - cursor: default; - } - - &:first-of-type { - margin-top: 24px; - } - .card { flex: 1; + margin-top: 8px; margin-bottom: 16px; - background: $white; - } - - .activity-log-item__card .foldable-card__content { - padding: 16px; - font-size: 14px; - color: darken( $gray, 20% ); } .foldable-card { - .foldable-card__expand .gridicon { transform: none; } @@ -51,10 +30,42 @@ @include breakpoint( "<480px" ) { padding: 12px; } + + // TODO: Remove when foldable cards become "expandable" + .is-clickable { + cursor: default; + } } - .foldable-card__main { - flex: 5 1; + .foldable-card__secondary { + flex-grow: 0; + } + + &.is-discarded { + margin-left: 80px; + + @include breakpoint( "<480px" ) { + margin-left: 60px; + } + + &:before { + content: ''; + position: absolute; + top: 0; + left: 33px; + height: 100%; + border-left: 2px dotted lighten( $gray, 20% ); + + @include breakpoint( "<480px" ) { + left: 22px; + } + } + + &:last-of-type { + &:before { + display: none; + } + } } } @@ -64,6 +75,7 @@ text-align: center; margin: -2px 22px 0 10px; padding: 4px 0 6px; + z-index: 1; @include breakpoint( "<480px" ) { margin: -2px 8px 0 0px; @@ -72,7 +84,7 @@ .activity-log-item__time { font-size: 11px; - color: $gray; + color: $gray-text-min; text-transform: uppercase; white-space: nowrap; @@ -108,12 +120,31 @@ &.is-error { background: $alert-red; } + + .is-discarded & { + color: $gray-text; + background: none; + border: 1px solid transparentize( lighten( $gray, 20% ), .5 ); + } +} + +.activity-log-item__card { + .foldable-card__content { + padding: 16px; + font-size: 14px; + color: darken( $gray, 20% ); + } + + .is-discarded & { + background: none; + box-shadow: 0 0 0 1px transparentize( lighten( $gray, 20% ), .5 ); + } } .activity-log-item__card-header { display: flex; - flex: 1; - align-items: center; + flex-wrap: wrap; + margin-right: 32px; @include breakpoint( "<960px" ) { flex-direction: column; @@ -123,28 +154,34 @@ .activity-log-item__actor { display: flex; - flex: 3 1; - align-items: center; + flex-shrink: 0; margin-right: 32px; - @include breakpoint( "<960px" ) { - order: 2; - } - .gravatar, .jetpack-logo { float: left; + width: 40px; + height: 40px; margin-right: 16px; + fill: darken( $gray, 10% ); @include breakpoint( "<960px" ) { - width: 24px; - height: 24px; + width: 32px; + height: 32px; margin-right: 8px; } } - .jetpack-logo path { - fill: $green-jetpack; + .gravatar { + .is-discarded & { + filter: grayscale(1); + } + } + + .jetpack-logo { + .is-discarded & { + opacity: .75; + } } } @@ -152,34 +189,23 @@ font-size: 14px; @include breakpoint( "<960px" ) { - font-size: 13px; + margin-top: 2px; + line-height: 1; } } .activity-log-item__actor-role { text-transform: capitalize; font-size: 12px; - color: $gray; + color: $gray-text-min; } .activity-log-item__title { - flex: 4 1; + flex: 1 1 50%; font-size: 14px; word-break: break-word; @include breakpoint( "<960px" ) { - margin-bottom: 16px; + margin-top: 8px; } } - -.activity-log-item__action { - flex-basis: 25%; - text-align:right; -} - -.activity-log-item__id { - margin-top: 8px; - font-size: 11px; - font-style: italic; - color: lighten( $gray, 20% ); -} diff --git a/client/my-sites/stats/activity-log/index.jsx b/client/my-sites/stats/activity-log/index.jsx index d94c70ba3cb62..11719d9ceab27 100644 --- a/client/my-sites/stats/activity-log/index.jsx +++ b/client/my-sites/stats/activity-log/index.jsx @@ -1,16 +1,16 @@ /** @format */ +/* eslint-disable wpcalypso/jsx-classname-namespace */ /** * External dependencies */ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import classNames from 'classnames'; import config from 'config'; import debugFactory from 'debug'; import scrollTo from 'lib/scroll-to'; import { connect } from 'react-redux'; import { localize } from 'i18n-calypso'; -import { get, groupBy, includes, isEmpty, isNull } from 'lodash'; +import { first, get, groupBy, includes, isEmpty, isNull, last, range } from 'lodash'; /** * Internal dependencies @@ -62,6 +62,127 @@ import { const debug = debugFactory( 'calypso:activity-log' ); const rewindEnabledByConfig = config.isEnabled( 'jetpack/activity-log/rewind' ); +const flushEmptyDays = days => [ + days.length === 1 ? 'empty-day' : 'empty-range', + [ first( days ), last( days ) ], +]; + +/** + * Takes a list of [ day, eventList ] pairs and produces + * a list of [ type, [ start, end ], eventList? ] triplets + * + * We have three ways to represent any given day with + * Activity Log events: + * + * - The day has events + * - The day has no events + * - The day has no events _and_ + * neither did the previous day + * + * When "empty days" follow other empty days then we + * want to group them into "empty ranges" so that we + * don't end up showing a bunch of needless empty + * day visual components on the page. + * + * Note: although this is recursive, since we don't + * expect to ever be descending more than than + * 31 times (in the worst case because there are + * no months with more than 31 days) we don't + * need to guard against stack overflow here, it + * just won't recurse that deeply. + * + * Example input: + * [ [ moment( '2017-10-08 14:48:01' ), [] ] + * , [ moment( '2017-10-09 03:13:48' ), [ event1, event2, … ] ] + * , [ moment( … ), [] ] + * , [ moment( … ), [] ] + * , [ moment( … ), [ event3 ] ] + * ] + * + * Example output: + * [ [ 'empty-day', [ moment( … ) ] ] + * , [ 'non-empty-day', [ moment( … ) ], [ event1, event2, … ] ] + * , [ 'empty-range', [ moment( … ), moment( … ) ] ] + * , [ 'non-empty-day', [ moment( …) ], [ event3 ] ] + * ] + * + * Note: the days coming into this function must be sorted. + * it doesn't matter in which direction, but they must + * be sequential one way or the other + * + * @param {Array} remainingDays remaining _sorted_ days to process + * @param {Array} groups final output data structure (see comment above) + * @param {Array} emptyDays running track of empty days to group + * @returns {Array} grouped days and events + */ +const intoVisualGroups = ( remainingDays, groups = [], emptyDays = [] ) => { + if ( ! remainingDays.length ) { + return emptyDays.length ? [ ...groups, flushEmptyDays( emptyDays ) ] : groups; + } + + const [ nextDay, ...nextRemaining ] = remainingDays; + const [ day, events ] = nextDay; + + // without activity we track the day in order to group empty days + if ( ! events.length ) { + return intoVisualGroups( nextRemaining, groups, [ ...emptyDays, day ] ); + } + + // if we have activity but no previously-tracked empty days + // then just push out this day onto the output + if ( ! emptyDays.length ) { + return intoVisualGroups( + nextRemaining, + [ ...groups, [ 'non-empty-day', [ day, day ], events ] ], + [] + ); + } + + // otherwise we want to flush out the tracked group into the output + // push this day out as well + // and restart without any tracked empty days + if ( emptyDays.length ) { + return intoVisualGroups( + nextRemaining, + [ ...groups, flushEmptyDays( emptyDays ), [ 'non-empty-day', [ day, day ], events ] ], + [] + ); + } +}; + +const daysInMonth = ( moment, startMoment, today ) => { + const endOfMonth = startMoment + .clone() + .endOf( 'month' ) + .startOf( 'day' ); + const startOfMonth = startMoment.clone().startOf( 'month' ); + const startOfToday = today.clone().startOf( 'day' ); + const endOfStream = moment.min( endOfMonth, startOfToday ); + + const asDayInMonth = n => startOfMonth.clone().add( n, 'day' ); + return range( endOfStream.date() ).map( asDayInMonth ); +}; + +const logsByDay = ( moment, logs, startMoment, applyOffset ) => { + const dayGroups = groupBy( logs, log => + applyOffset( moment.utc( log.activityTs ) ) + .endOf( 'day' ) + .valueOf() + ); + + return daysInMonth( moment, startMoment, applyOffset( moment.utc() ) ).map( day => [ + day, + get( + dayGroups, + day + .clone() + .endOf( 'day' ) + .valueOf(), + [] + ), + ] ); +}; + class ActivityLog extends Component { static propTypes = { restoreProgress: PropTypes.shape( { @@ -82,7 +203,7 @@ class ActivityLog extends Component { // 'success', // 'success-with-errors', ] ).isRequired, - timestamp: PropTypes.number.isRequired, + timestamp: PropTypes.string.isRequired, } ), recordTracksEvent: PropTypes.func.isRequired, requestedRestoreActivity: PropTypes.shape( { @@ -148,11 +269,11 @@ class ActivityLog extends Component { handleRestoreDialogConfirm = () => { const { recordTracksEvent, requestedRestoreActivity, rewindRestore, siteId } = this.props; - const { activityTs: timestamp } = requestedRestoreActivity; + const { rewindId } = requestedRestoreActivity; debug( 'Restore requested for after activity %o', requestedRestoreActivity ); - recordTracksEvent( 'calypso_activitylog_restore_confirm', { timestamp } ); - rewindRestore( siteId, timestamp ); + recordTracksEvent( 'calypso_activitylog_restore_confirm', { rewindId } ); + rewindRestore( siteId, rewindId ); }; /** @@ -252,119 +373,6 @@ class ActivityLog extends Component { } } - renderLogs() { - const { - isPressable, - isRewindActive, - logs, - moment, - requestedRestoreActivity, - requestedRestoreActivityId, - siteId, - translate, - rewindStartDate, - } = this.props; - const startMoment = this.getStartMoment(); - - if ( isNull( logs ) ) { - return ( -
    - - - -
    - ); - } - - if ( isEmpty( rewindStartDate ) ) { - return [ - - { translate( 'Come back in a little while to see your site activity.' ) } -
    - { translate( "You will receive a notification once it's complete!" ) } -
    - } - illustration="/calypso/images/illustrations/al-syncing-site.svg" - className="activity-log__first-sync" - />, - ]; - } - - if ( isEmpty( logs ) ) { - return ( - - ); - } - - const disableRestore = this.isRestoreInProgress(); - const logsGroupedByDay = groupBy( logs, log => - this.applySiteOffset( moment.utc( log.activityTs ) ) - .endOf( 'day' ) - .valueOf() - ); - const rewindConfirmDialog = requestedRestoreActivity && ( - - ); - - const activityDays = []; - // loop backwards through each day in the month - for ( - const m = moment.min( - startMoment - .clone() - .endOf( 'month' ) - .startOf( 'day' ), - this.applySiteOffset( moment.utc() ).startOf( 'day' ) - ), - startOfMonth = startMoment - .clone() - .startOf( 'month' ) - .valueOf(); - startOfMonth <= m.valueOf(); - m.subtract( 1, 'day' ) - ) { - const dayEnd = m.endOf( 'day' ).valueOf(); - activityDays.push( - - ); - } - - return ( -
    - { activityDays } -
    - ); - } - renderMonthNavigation( position ) { const { logs, slug } = this.props; const startOfMonth = this.getStartMoment().startOf( 'month' ); @@ -397,6 +405,10 @@ class ActivityLog extends Component { gmtOffset, isPressable, isRewindActive, + logs, + moment, + requestedRestoreActivity, + requestedRestoreActivityId, siteId, slug, startDate, @@ -418,6 +430,25 @@ class ActivityLog extends Component { ); } + const disableRestore = this.isRestoreInProgress(); + + const rewindConfirmDialog = requestedRestoreActivity && ( + + ); + + const visualGroups = intoVisualGroups( + logsByDay( moment, logs, this.getStartMoment(), this.applySiteOffset ) + ); + const today = moment() + .utc() + .startOf( 'day' ); + return (
    { rewindEnabledByConfig && } @@ -433,7 +464,82 @@ class ActivityLog extends Component { { hasFirstBackup && this.renderMonthNavigation() } { this.renderBanner() } { ! isRewindActive && !! isPressable && } - { this.renderLogs() } + { isNull( logs ) && ( +
    + + + +
    + ) } + { ! isNull( logs ) && + isEmpty( logs ) && ( + + ) } + { ! isEmpty( logs ) && ( +
    + { visualGroups + .slice() + .reverse() // show with newest event on top + .map( ( [ type, [ start, end ], events ] ) => { + const isToday = today.isSame( + end + .clone() + .utc() + .startOf( 'day' ) + ); + + switch ( type ) { + case 'empty-day': + return ( +
    +
    + { start.format( 'LL' ) } + { isToday && ` \u2014 ${ translate( 'Today' ) }` } +
    +
    + { translate( 'No activity' ) } +
    +
    + ); + + case 'empty-range': + return ( +
    +
    + { `${ start.format( 'LL' ) } - ${ end.format( 'LL' ) }` } + { isToday && ` \u2014 ${ translate( 'Today' ) }` } +
    +
    + { translate( 'No activity' ) } +
    +
    + ); + + case 'non-empty-day': + return ( + + ); + } + } ) } +
    + ) } { hasFirstBackup && this.renderMonthNavigation( 'bottom' ) }
    diff --git a/client/my-sites/stats/activity-log/style.scss b/client/my-sites/stats/activity-log/style.scss index 199d8cc5f2971..04c225a4d7658 100644 --- a/client/my-sites/stats/activity-log/style.scss +++ b/client/my-sites/stats/activity-log/style.scss @@ -1,5 +1,23 @@ // Activity Log +.activity-log__wrapper { + position: relative; + + &:before { + content: ''; + position: absolute; + top: 0; + left: 33px; + height: 100%; + width: 2px; + background: lighten( $gray, 20% ); + + @include breakpoint( "<480px" ) { + left: 29px; + } + } +} + .activity-log__rewind-toggle { margin-bottom: 18px; } @@ -11,14 +29,20 @@ } } -.rewind-requested .activity-log-day:not(.has-rewind-dialog), -.has-rewind-dialog .activity-log-item, -.has-rewind-dialog > .foldable-card > .foldable-card__header { - opacity: .5; +.activity-log__empty-day { + background: $gray-light; + width: 100%; + padding: 0 16px 4px; + position: relative; + z-index: 2; + margin-bottom: 16px; +} + +.activity-log__empty-day-title { + font-weight: 600; } -.has-rewind-dialog .activity-log-item__restore-confirm, -.activity-log-item__restore-confirm ~ .activity-log-item, -.rewind-requested .has-rewind-dialog ~ .activity-log-day { - opacity: 1; -} \ No newline at end of file +.activity-log__empty-day-events { + font-size: 12px; + color: $gray-text-min; +} diff --git a/client/post-editor/media-modal/index.jsx b/client/post-editor/media-modal/index.jsx index a3a63dfc090ec..349e9bb7c7509 100644 --- a/client/post-editor/media-modal/index.jsx +++ b/client/post-editor/media-modal/index.jsx @@ -34,6 +34,7 @@ import MediaModalGallery from './gallery'; import MediaActions from 'lib/media/actions'; import MediaUtils from 'lib/media/utils'; import Dialog from 'components/dialog'; +import CloseOnEscape from 'components/close-on-escape'; import accept from 'lib/accept'; import { getMediaModalView } from 'state/ui/media-modal/selectors'; import { getSite } from 'state/sites/selectors'; @@ -603,7 +604,9 @@ export class EditorMediaModal extends Component { onClose={ this.onClose } additionalClassNames="editor-media-modal" shouldCloseOnOverlayClick={ this.shouldClose() } + shouldCloseOnEsc={ false } > + { this.renderContent() } ); diff --git a/client/reader/feed-stream/index.jsx b/client/reader/feed-stream/index.jsx index 4d09f4767b0f4..a038a6e94d190 100644 --- a/client/reader/feed-stream/index.jsx +++ b/client/reader/feed-stream/index.jsx @@ -41,7 +41,7 @@ class FeedStream extends React.Component { const emptyContent = ; const title = getSiteName( { feed, site } ) || this.props.translate( 'Loading Feed' ); - if ( feed && feed.is_error ) { + if ( ( feed && feed.is_error ) || ( site && site.is_error && site.error.code === 410 ) ) { return ; } diff --git a/client/reader/search-stream/style.scss b/client/reader/search-stream/style.scss index 190bf63a401f7..9f712911c28fb 100644 --- a/client/reader/search-stream/style.scss +++ b/client/reader/search-stream/style.scss @@ -341,7 +341,7 @@ display: none; } -.search-stream__results.is-two-columns .gridicon__follow { +.search-stream__results.is-two-columns .gridicons-reader-follow { left: 2px; } diff --git a/client/signup/config/flows.js b/client/signup/config/flows.js index 47a0ec30d514d..04ca47e70c14d 100644 --- a/client/signup/config/flows.js +++ b/client/signup/config/flows.js @@ -244,8 +244,8 @@ const flows = { }; if ( config.isEnabled( 'signup/atomic-store-flow' ) ) { - flows[ 'atomic-store' ] = { - steps: [ 'design-type-with-atomic-store', 'themes', 'domains', 'plans-atomic-store', 'user' ], + flows[ 'store-nux' ] = { + steps: [ 'design-type-with-store-nux', 'themes', 'domains', 'plans-store-nux', 'user' ], destination: getSiteDestination, description: 'Signup flow for creating an online store with an Atomic site', lastModified: '2017-09-27', @@ -302,20 +302,39 @@ function removeUserStepFromFlow( flow ) { } ); } -function filterDesignTypeInFlow( flow ) { +function replaceStepInFlow( flow, oldStepName, newStepName ) { + // no change + if ( ! includes( flow.steps, oldStepName ) ) { + return flow; + } + + return assign( {}, flow, { + steps: flow.steps.map( stepName => ( stepName === oldStepName ? newStepName : stepName ) ), + } ); +} + +function filterDesignTypeInFlow( flowName, flow ) { if ( ! flow ) { return; } - if ( ! includes( flow.steps, 'design-type' ) ) { - return flow; + if ( config.isEnabled( 'signup/atomic-store-flow' ) ) { + // If Atomic Store is enabled, replace 'design-type-with-store' with + // 'design-type-with-store-nux' in flows other than 'pressable'. + if ( flowName !== 'pressable' && includes( flow.steps, 'design-type-with-store' ) ) { + return replaceStepInFlow( flow, 'design-type-with-store', 'design-type-with-store-nux' ); + } + + // Show store option to everyone if Atomic Store is enabled + return replaceStepInFlow( flow, 'design-type', 'design-type-with-store-nux' ); } - return assign( {}, flow, { - steps: flow.steps.map( - stepName => ( stepName === 'design-type' ? 'design-type-with-store' : stepName ) - ), - } ); + // Show design type with store option only to new users with EN locale + if ( ! user.get() && 'en' === i18n.getLocaleSlug() ) { + return replaceStepInFlow( flow, 'design-type', 'design-type-with-store' ); + } + + return flow; } /** @@ -378,10 +397,8 @@ const Flows = { flow = removeUserStepFromFlow( flow ); } - // Show design type with store option only to new users with EN locale. - if ( ! user.get() && 'en' === i18n.getLocaleSlug() ) { - flow = filterDesignTypeInFlow( flow ); - } + // Maybe modify the design type step to a variant with store + flow = filterDesignTypeInFlow( flowName, flow ); Flows.preloadABTestVariationsForStep( flowName, currentStepName ); diff --git a/client/signup/config/step-components.js b/client/signup/config/step-components.js index ef1913dce9b0a..f13255791688d 100644 --- a/client/signup/config/step-components.js +++ b/client/signup/config/step-components.js @@ -25,7 +25,7 @@ import PlansAtomicStoreComponent from 'signup/steps/plans-atomic-store'; export default { 'design-type': DesignTypeComponent, 'design-type-with-store': DesignTypeWithStoreComponent, - 'design-type-with-atomic-store': DesignTypeWithAtomicStoreComponent, + 'design-type-with-store-nux': DesignTypeWithAtomicStoreComponent, domains: DomainsStepComponent, 'domain-only': DomainsStepComponent, 'domains-theme-preselected': DomainsStepComponent, @@ -33,7 +33,7 @@ export default { 'get-dot-blog-plans': GetDotBlogPlansStepComponent, 'get-dot-blog-themes': ThemeSelectionComponent, plans: PlansStepComponent, - 'plans-atomic-store': PlansAtomicStoreComponent, + 'plans-store-nux': PlansAtomicStoreComponent, 'plans-site-selected': PlansStepWithoutFreePlan, site: SiteComponent, 'rebrand-cities-welcome': RebrandCitiesWelcomeComponent, diff --git a/client/signup/config/steps.js b/client/signup/config/steps.js index ba6140a685816..af98414cdb652 100644 --- a/client/signup/config/steps.js +++ b/client/signup/config/steps.js @@ -86,8 +86,8 @@ export default { providesDependencies: [ 'designType', 'themeSlugWithRepo' ], }, - 'design-type-with-atomic-store': { - stepName: 'design-type-with-atomic-store', + 'design-type-with-store-nux': { + stepName: 'design-type-with-store-nux', providesDependencies: [ 'designType', 'themeSlugWithRepo' ], }, @@ -134,8 +134,8 @@ export default { providesDependencies: [ 'cartItem', 'privacyItem' ], }, - 'plans-atomic-store': { - stepName: 'plans-atomic-store', + 'plans-store-nux': { + stepName: 'plans-store-nux', apiRequestFunction: stepActions.addPlanToCart, dependencies: [ 'siteSlug', 'siteId', 'domainItem' ], providesDependencies: [ 'cartItem', 'privacyItem' ], diff --git a/client/signup/main.jsx b/client/signup/main.jsx index 590c04c5c59b3..e9d7c770d530f 100644 --- a/client/signup/main.jsx +++ b/client/signup/main.jsx @@ -348,7 +348,9 @@ class Signup extends React.Component { ); }; - goToStep = ( stepName, stepSectionName ) => { + // `flowName` is an optional parameter used to redirect to another flow, i.e., from `main` + // to `store-nux`. If not specified, the current flow (`this.props.flowName`) continues. + goToStep = ( stepName, stepSectionName, flowName = this.props.flowName ) => { if ( this.state.scrolling ) { return; } @@ -370,23 +372,28 @@ class Signup extends React.Component { // redirect the user to the next step scrollPromise.then( () => { if ( ! this.isEveryStepSubmitted() ) { - page( - utils.getStepUrl( this.props.flowName, stepName, stepSectionName, this.props.locale ) - ); + if ( flowName !== this.props.flowName ) { + // if flow is being changed, tell SignupFlowController about the change and save + // a new value of `signupFlowName` to local storage. + this.signupFlowController.changeFlowName( flowName ); + } + page( utils.getStepUrl( flowName, stepName, stepSectionName, this.props.locale ) ); } else if ( this.isEveryStepSubmitted() ) { this.goToFirstInvalidStep(); } } ); }; - goToNextStep = () => { - const flowSteps = flows.getFlow( this.props.flowName, this.props.stepName ).steps, + // `nextFlowName` is an optional parameter used to redirect to another flow, i.e., from `main` + // to `store-nux`. If not specified, the current flow (`this.props.flowName`) continues. + goToNextStep = ( nextFlowName = this.props.flowName ) => { + const flowSteps = flows.getFlow( nextFlowName, this.props.stepName ).steps, currentStepIndex = indexOf( flowSteps, this.props.stepName ), nextStepName = flowSteps[ currentStepIndex + 1 ], nextProgressItem = this.state.progress[ currentStepIndex + 1 ], nextStepSection = ( nextProgressItem && nextProgressItem.stepSectionName ) || ''; - this.goToStep( nextStepName, nextStepSection ); + this.goToStep( nextStepName, nextStepSection, nextFlowName ); }; goToFirstInvalidStep = () => { diff --git a/client/signup/steps/design-type-with-atomic-store/index.jsx b/client/signup/steps/design-type-with-atomic-store/index.jsx index 426241fdba2b4..33073dd5b7d05 100644 --- a/client/signup/steps/design-type-with-atomic-store/index.jsx +++ b/client/signup/steps/design-type-with-atomic-store/index.jsx @@ -5,11 +5,12 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import classNames from 'classnames'; -import { invoke } from 'lodash'; +import { includes, invoke } from 'lodash'; /** * Internal dependencies */ +import config from 'config'; import StepWrapper from 'signup/step-wrapper'; import Card from 'components/card'; import { localize } from 'i18n-calypso'; @@ -28,9 +29,15 @@ import SignupProgressStore from 'lib/signup/progress-store'; import { getSignupDependencyStore } from 'state/signup/dependency-store/selectors'; import { DESIGN_TYPE_STORE } from 'signup/constants'; import PressableStoreStep from '../design-type-with-store/pressable-store'; +import QueryGeo from 'components/data/query-geo'; +import { getGeoCountryShort } from 'state/geo/selectors'; +import { getCurrentUserCountryCode } from 'state/current-user/selectors'; class DesignTypeWithAtomicStoreStep extends Component { - state = { showStore: false }; + state = { + showStore: false, + pendingStoreClick: false, + }; setPressableStore = ref => ( this.pressableStore = ref ); getChoices() { @@ -90,13 +97,24 @@ class DesignTypeWithAtomicStoreStep extends Component { }; handleNextStep = designType => { + if ( designType === DESIGN_TYPE_STORE && ! this.props.countryCode ) { + // if we don't know the country code, we can't proceed. Continue after the code arrives + this.setState( { pendingStoreClick: true } ); + return; + } + + this.setState( { pendingStoreClick: false } ); + this.props.setDesignType( designType ); this.props.recordTracksEvent( 'calypso_triforce_select_design', { category: designType } ); + const isCountryAllowed = + includes( [ 'US', 'CA' ], this.props.countryCode ) || config( 'env' ) === 'development'; + if ( - abtest( 'signupPressableStoreFlow' ) === 'pressable' && - designType === DESIGN_TYPE_STORE + designType === DESIGN_TYPE_STORE && + ( abtest( 'signupPressableStoreFlow' ) === 'pressable' || ! isCountryAllowed ) ) { this.scrollUp(); @@ -113,10 +131,17 @@ class DesignTypeWithAtomicStoreStep extends Component { designType, } ); - this.props.goToNextStep(); + // If the user chooses `store` as design type, redirect to the `store-nux` flow. + // For other choices, continue with the current flow. + const nextFlowName = designType === DESIGN_TYPE_STORE ? 'store-nux' : this.props.flowName; + this.props.goToNextStep( nextFlowName ); }; renderChoice = choice => { + const buttonClassName = classNames( 'button design-type-with-atomic-store__cta is-compact', { + 'is-busy': choice.type === DESIGN_TYPE_STORE && this.state.pendingStoreClick, + } ); + return (
    { choice.image }
    - - { choice.label } - + { choice.label }

    { choice.description }

    @@ -139,7 +162,7 @@ class DesignTypeWithAtomicStoreStep extends Component { }; renderChoices() { - const { translate } = this.props; + const { countryCode, translate } = this.props; const disclaimerText = translate( 'Not sure? Pick the closest option. You can always change your settings later.' ); // eslint-disable-line max-len @@ -154,6 +177,7 @@ class DesignTypeWithAtomicStoreStep extends Component { return (
    + { this.state.pendingStoreClick && ! countryCode && }
    { - return { - signupDependencyStore: getSignupDependencyStore( state ), - }; - }, + state => ( { + signupDependencyStore: getSignupDependencyStore( state ), + countryCode: getCurrentUserCountryCode( state ) || getGeoCountryShort( state ), + } ), { recordTracksEvent, setDesignType, diff --git a/client/signup/steps/design-type-with-store/pressable-store/style.scss b/client/signup/steps/design-type-with-store/pressable-store/style.scss index e3e820f8f3a44..c13906160dc5e 100644 --- a/client/signup/steps/design-type-with-store/pressable-store/style.scss +++ b/client/signup/steps/design-type-with-store/pressable-store/style.scss @@ -58,6 +58,10 @@ .pressable-store__privacy-policy { text-align: center; + + .gridicon { + top: auto; + } } .pressable-store__back-button-wrapper { diff --git a/client/signup/steps/domains/index.jsx b/client/signup/steps/domains/index.jsx index 1c7a0d0c4a03a..fc75e364b8be3 100644 --- a/client/signup/steps/domains/index.jsx +++ b/client/signup/steps/domains/index.jsx @@ -211,7 +211,7 @@ class DomainsStep extends React.Component { mapDomainUrl={ this.getMapDomainUrl() } onAddMapping={ this.handleAddMapping.bind( this, 'domainForm' ) } onSave={ this.handleSave.bind( this, 'domainForm' ) } - offerMappingOption={ ! this.props.isDomainOnly } + offerUnavailableOption={ ! this.props.isDomainOnly } analyticsSection="signup" domainsWithPlansOnly={ this.props.domainsWithPlansOnly } includeWordPressDotCom={ ! this.props.isDomainOnly && ! this.isDomainForAtomicSite() } diff --git a/client/signup/steps/site-or-domain/choice.jsx b/client/signup/steps/site-or-domain/choice.jsx index 322ae06f9c5bb..a061b01243c5a 100644 --- a/client/signup/steps/site-or-domain/choice.jsx +++ b/client/signup/steps/site-or-domain/choice.jsx @@ -40,7 +40,7 @@ export default class SiteOrDomainChoice extends Component { } return ( -
    +
    { choice.image } diff --git a/client/signup/steps/site-or-domain/index.jsx b/client/signup/steps/site-or-domain/index.jsx index e345d85717643..487b5120cb886 100644 --- a/client/signup/steps/site-or-domain/index.jsx +++ b/client/signup/steps/site-or-domain/index.jsx @@ -38,12 +38,12 @@ class SiteOrDomain extends Component { } getDomainName() { - const { queryObject, step } = this.props; + const { initialContext: { query }, step } = this.props; let domain, isValidDomain = false; - if ( queryObject && queryObject.new ) { - domain = queryObject.new; + if ( query && query.new ) { + domain = query.new; } else if ( step && step.domainItem ) { domain = step.domainItem.meta; } diff --git a/client/signup/steps/theme-selection/index.jsx b/client/signup/steps/theme-selection/index.jsx index 57fd87006e800..18037942e84d4 100644 --- a/client/signup/steps/theme-selection/index.jsx +++ b/client/signup/steps/theme-selection/index.jsx @@ -80,20 +80,6 @@ class ThemeSelectionStep extends Component { ); } - shouldGoToFirstStep() { - const { dependencyStore } = this.props; - - return ( - isEnabled( 'signup/atomic-store-flow' ) && - this.props.designType === 'store' && - dependencyStore.themeSlugWithRepo - ); - } - - shouldSkipStep() { - return false; - } - isStoreSignup() { const { signupDependencies = {} } = this.props; @@ -103,31 +89,7 @@ class ThemeSelectionStep extends Component { ); } - componentWillMount() { - if ( this.shouldGoToFirstStep() ) { - this.props.goToStep( 'design-type-with-atomic-store' ); - } else if ( this.shouldSkipStep() ) { - SignupActions.submitSignupStep( - { - stepName: this.props.stepName, - processingMessage: this.props.translate( 'Adding your theme' ), - repoSlug: '', - }, - null, - { - themeSlugWithRepo: '', - } - ); - - this.props.goToNextStep(); - } - } - render = () => { - if ( this.shouldGoToFirstStep() || this.shouldSkipStep() ) { - return null; - } - const storeSignup = this.isStoreSignup(); const defaultDependencies = this.props.useHeadstart ? { themeSlugWithRepo: 'pub/twentysixteen' } diff --git a/client/state/action-types.js b/client/state/action-types.js index 2eb09c6b12450..f19a9ff4e5200 100644 --- a/client/state/action-types.js +++ b/client/state/action-types.js @@ -207,23 +207,30 @@ export const HAPPINESS_ENGINEERS_FETCH_FAILURE = 'HAPPINESS_ENGINEERS_FETCH_FAIL export const HAPPINESS_ENGINEERS_FETCH_SUCCESS = 'HAPPINESS_ENGINEERS_FETCH_SUCCESS'; export const HAPPINESS_ENGINEERS_RECEIVE = 'HAPPINESS_ENGINEERS_RECEIVE'; export const HAPPYCHAT_BLUR = 'HAPPYCHAT_BLUR'; -export const HAPPYCHAT_CONNECT = 'HAPPYCHAT_CONNECT'; -export const HAPPYCHAT_CONNECTED = 'HAPPYCHAT_CONNECTED'; -export const HAPPYCHAT_CONNECTING = 'HAPPYCHAT_CONNECTING'; -export const HAPPYCHAT_DISCONNECTED = 'HAPPYCHAT_DISCONNECTED'; export const HAPPYCHAT_FOCUS = 'HAPPYCHAT_FOCUS'; -export const HAPPYCHAT_INITIALIZE = 'HAPPYCHAT_INITIALIZE'; +export const HAPPYCHAT_IO_INIT = 'HAPPYCHAT_IO_INIT'; +export const HAPPYCHAT_IO_RECEIVE_ACCEPT = 'HAPPYCHAT_IO_RECEIVE_ACCEPT'; +export const HAPPYCHAT_IO_RECEIVE_CONNECT = 'HAPPYCHAT_IO_RECEIVE_CONNECT'; +export const HAPPYCHAT_IO_RECEIVE_DISCONNECT = 'HAPPYCHAT_IO_RECEIVE_DISCONNECT'; +export const HAPPYCHAT_IO_RECEIVE_ERROR = 'HAPPYCHAT_IO_RECEIVE_ERROR'; +export const HAPPYCHAT_IO_RECEIVE_INIT = 'HAPPYCHAT_IO_RECEIVE_INIT'; +export const HAPPYCHAT_IO_RECEIVE_MESSAGE = 'HAPPYCHAT_IO_RECEIVE_MESSAGE'; +export const HAPPYCHAT_IO_RECEIVE_RECONNECTING = 'HAPPYCHAT_IO_RECEIVE_RECONNECTING'; +export const HAPPYCHAT_IO_RECEIVE_STATUS = 'HAPPYCHAT_IO_RECEIVE_STATUS'; +export const HAPPYCHAT_IO_RECEIVE_TOKEN = 'HAPPYCHAT_IO_RECEIVE_TOKEN'; +export const HAPPYCHAT_IO_RECEIVE_UNAUTHORIZED = 'HAPPYCHAT_IO_RECEIVE_UNAUTHORIZED'; +export const HAPPYCHAT_IO_REQUEST_TRANSCRIPT = 'HAPPYCHAT_IO_REQUEST_TRANSCRIPT'; +export const HAPPYCHAT_IO_REQUEST_TRANSCRIPT_RECEIVE = 'HAPPYCHAT_IO_REQUEST_TRANSCRIPT_RECEIVE'; +export const HAPPYCHAT_IO_REQUEST_TRANSCRIPT_TIMEOUT = 'HAPPYCHAT_IO_REQUEST_TRANSCRIPT_TIMEOUT'; +export const HAPPYCHAT_IO_SEND_MESSAGE_EVENT = 'HAPPYCHAT_IO_SEND_MESSAGE_EVENT'; +export const HAPPYCHAT_IO_SEND_MESSAGE_LOG = 'HAPPYCHAT_IO_SEND_MESSAGE_LOG'; +export const HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE = 'HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE'; +export const HAPPYCHAT_IO_SEND_MESSAGE_USERINFO = 'HAPPYCHAT_IO_SEND_MESSAGE_USERINFO'; +export const HAPPYCHAT_IO_SEND_PREFERENCES = 'HAPPYCHAT_IO_SEND_PREFERENCES'; +export const HAPPYCHAT_IO_SEND_TYPING = 'HAPPYCHAT_IO_SEND_TYPING'; export const HAPPYCHAT_MINIMIZING = 'HAPPYCHAT_MINIMIZING'; export const HAPPYCHAT_OPEN = 'HAPPYCHAT_OPEN'; -export const HAPPYCHAT_RECEIVE_EVENT = 'HAPPYCHAT_RECEIVE_EVENT'; -export const HAPPYCHAT_RECONNECTING = 'HAPPYCHAT_RECONNECTING'; -export const HAPPYCHAT_SEND_USER_INFO = 'HAPPYCHAT_SEND_USER_INFO'; -export const HAPPYCHAT_SEND_MESSAGE = 'HAPPYCHAT_SEND_MESSAGE'; -export const HAPPYCHAT_SET_AVAILABLE = 'HAPPYCHAT_SET_AVAILABLE'; -export const HAPPYCHAT_SET_CHAT_STATUS = 'HAPPYCHAT_SET_CHAT_STATUS'; export const HAPPYCHAT_SET_CURRENT_MESSAGE = 'HAPPYCHAT_SET_CURRENT_MESSAGE'; -export const HAPPYCHAT_TRANSCRIPT_RECEIVE = 'HAPPYCHAT_TRANSCRIPT_RECEIVE'; -export const HAPPYCHAT_TRANSCRIPT_REQUEST = 'HAPPYCHAT_TRANSCRIPT_REQUEST'; export const HELP_COURSES_RECEIVE = 'HELP_COURSES_RECEIVE'; export const HELP_CONTACT_FORM_SITE_SELECT = 'HELP_CONTACT_FORM_SITE_SELECT'; export const HELP_TICKET_CONFIGURATION_DISMISS_ERROR = 'HELP_TICKET_CONFIGURATION_DISMISS_ERROR'; @@ -294,6 +301,16 @@ export const JETPACK_CONNECT_SSO_VALIDATION_REQUEST = 'JETPACK_CONNECT_SSO_VALID export const JETPACK_CONNECT_SSO_VALIDATION_SUCCESS = 'JETPACK_CONNECT_SSO_VALIDATION_SUCCESS'; export const JETPACK_CONNECT_STORE_SESSION = 'JETPACK_CONNECT_STORE_SESSION'; export const JETPACK_CONNECT_USER_ALREADY_CONNECTED = 'JETPACK_CONNECT_USER_ALREADY_CONNECTED'; +export const JETPACK_CREDENTIALS_AUTOCONFIGURE = 'JETPACK_CREDENTIALS_AUTOCONFIGURE'; +export const JETPACK_CREDENTIALS_AUTOCONFIGURE_FAILURE = + 'JETPACK_CREDENTIALS_AUTOCONFIGURE_FAILURE'; +export const JETPACK_CREDENTIALS_AUTOCONFIGURE_SUCCESS = + 'JETPACK_CREDENTIALS_AUTOCONFIGURE_SUCCESS'; +export const JETPACK_CREDENTIALS_REQUEST = 'JETPACK_CREDENTIALS_REQUEST'; +export const JETPACK_CREDENTIALS_STORE = 'JETPACK_CREDENTIALS_STORE'; +export const JETPACK_CREDENTIALS_UPDATE = 'JETPACK_CREDENTIALS_UPDATE'; +export const JETPACK_CREDENTIALS_UPDATE_SUCCESS = 'JETPACK_CREDENTIALS_UPDATE_SUCCESS'; +export const JETPACK_CREDENTIALS_UPDATE_FAILURE = 'JETPACK_CREDENTIALS_UPDATE_FAILURE'; export const JETPACK_DISCONNECT_RECEIVE = 'JETPACK_DISCONNECT_RECEIVE'; export const JETPACK_DISCONNECT_REQUEST = 'JETPACK_DISCONNECT_REQUEST'; export const JETPACK_DISCONNECT_REQUEST_FAILURE = 'JETPACK_DISCONNECT_REQUEST_FAILURE'; @@ -344,6 +361,7 @@ export const JETPACK_USER_CONNECTION_DATA_REQUEST_FAILURE = export const JETPACK_USER_CONNECTION_DATA_REQUEST_SUCCESS = 'JETPACK_USER_CONNECTION_DATA_REQUEST_SUCCESS'; export const JITM_SET = 'JITM_SET'; +export const JITM_DISMISS = 'JITM_DISMISS'; export const KEYRING_CONNECTIONS_RECEIVE = 'KEYRING_CONNECTIONS_RECEIVE'; export const KEYRING_CONNECTIONS_REQUEST = 'KEYRING_CONNECTIONS_REQUEST'; export const KEYRING_CONNECTIONS_REQUEST_FAILURE = 'KEYRING_CONNECTIONS_REQUEST_FAILURE'; @@ -687,6 +705,7 @@ export const READER_UNSUBSCRIBE_TO_NEW_COMMENT_EMAIL = 'READER_UNSUBSCRIBE_TO_NE export const READER_UNSUBSCRIBE_TO_NEW_POST_EMAIL = 'READER_UNSUBSCRIBE_TO_NEW_POST_EMAIL'; export const READER_UPDATE_NEW_POST_EMAIL_SUBSCRIPTION = 'READER_UPDATE_NEW_POST_EMAIL_SUBSCRIPTION'; +export const READER_VIEW_STREAM = 'READER_VIEW_STREAM'; export const RECEIPT_FETCH = 'RECEIPT_FETCH'; export const RECEIPT_FETCH_COMPLETED = 'RECEIPT_FETCH_COMPLETED'; export const RECEIPT_FETCH_FAILED = 'RECEIPT_FETCH_FAILED'; diff --git a/client/state/audio/middleware.js b/client/state/audio/middleware.js index 3d51165804cfd..c0a6a7acda089 100644 --- a/client/state/audio/middleware.js +++ b/client/state/audio/middleware.js @@ -1,10 +1,9 @@ +/** @format */ + /** * Internal dependencies - * - * @format */ - -import { HAPPYCHAT_RECEIVE_EVENT } from 'state/action-types'; +import { HAPPYCHAT_IO_RECEIVE_MESSAGE } from 'state/action-types'; const isAudioSupported = () => typeof window === 'object' && typeof window.Audio === 'function'; @@ -17,10 +16,10 @@ export const playSound = src => { audioClip.play(); }; -export const playSoundForMessageToCustomer = ( dispatch, { event } ) => { +export const playSoundForMessageToCustomer = ( dispatch, { message } ) => { // If the customer sent the message, there's no // need to play a sound to the customer. - if ( event && event.source === 'customer' ) { + if ( message && message.source === 'customer' ) { return; } @@ -33,7 +32,7 @@ export const playSoundForMessageToCustomer = ( dispatch, { event } ) => { // Initialized this way for performance reasons export const handlers = Object.create( null ); -handlers[ HAPPYCHAT_RECEIVE_EVENT ] = playSoundForMessageToCustomer; +handlers[ HAPPYCHAT_IO_RECEIVE_MESSAGE ] = playSoundForMessageToCustomer; /** * Middleware diff --git a/client/state/audio/test/middleware.js b/client/state/audio/test/middleware.js index 6077980b29f43..5e0c63dc8bd19 100644 --- a/client/state/audio/test/middleware.js +++ b/client/state/audio/test/middleware.js @@ -10,7 +10,7 @@ import { spy } from 'sinon'; * Internal dependencies */ import middleware from '../middleware'; -import { HAPPYCHAT_RECEIVE_EVENT } from 'state/action-types'; +import { HAPPYCHAT_IO_RECEIVE_MESSAGE } from 'state/action-types'; describe( 'Audio Middleware', () => { let next; @@ -50,8 +50,8 @@ describe( 'Audio Middleware', () => { test( 'should not play any sound when no audio support', () => { const action = { - type: HAPPYCHAT_RECEIVE_EVENT, - event: { + type: HAPPYCHAT_IO_RECEIVE_MESSAGE, + message: { source: 'operator', }, }; @@ -67,8 +67,8 @@ describe( 'Audio Middleware', () => { test( 'should play sound when receiving a new message from the operator', () => { const action = { - type: HAPPYCHAT_RECEIVE_EVENT, - event: { + type: HAPPYCHAT_IO_RECEIVE_MESSAGE, + message: { source: 'operator', }, }; diff --git a/client/state/automated-transfer/reducer.js b/client/state/automated-transfer/reducer.js index 6f83ce6fa2189..f60a91a2d3364 100644 --- a/client/state/automated-transfer/reducer.js +++ b/client/state/automated-transfer/reducer.js @@ -10,7 +10,12 @@ import { get } from 'lodash'; * Internal dependencies */ import eligibility from './eligibility/reducer'; -import { combineReducers, keyedReducer, withSchemaValidation } from 'state/utils'; +import { + combineReducers, + keyedReducer, + withSchemaValidation, + withoutPersistence, +} from 'state/utils'; import { transferStates } from './constants'; import { automatedTransfer as schema } from './schema'; import { @@ -36,15 +41,18 @@ export const status = ( state = null, action ) => state ); -export const fetchingStatus = ( state = false, action ) => - get( - { - [ REQUEST_STATUS ]: true, - [ REQUEST_STATUS_FAILURE ]: false, - }, - action.type, - state - ); +export const fetchingStatus = withoutPersistence( ( state = false, action ) => { + switch ( action.type ) { + case REQUEST_STATUS: + return true; + + case REQUEST_STATUS_FAILURE: + return false; + + default: + return state; + } +} ); export const siteReducer = combineReducers( { eligibility, diff --git a/client/state/automated-transfer/test/reducer.js b/client/state/automated-transfer/test/reducer.js index ab81f03a40818..c0dc9ca9f9dd1 100644 --- a/client/state/automated-transfer/test/reducer.js +++ b/client/state/automated-transfer/test/reducer.js @@ -14,6 +14,8 @@ import { AUTOMATED_TRANSFER_ELIGIBILITY_UPDATE as ELIGIBILITY_UPDATE, AUTOMATED_TRANSFER_STATUS_REQUEST as REQUEST_STATUS, AUTOMATED_TRANSFER_STATUS_REQUEST_FAILURE as REQUEST_STATUS_FAILURE, + SERIALIZE, + DESERIALIZE, } from 'state/action-types'; describe( 'state', () => { @@ -45,6 +47,20 @@ describe( 'state', () => { expect( fetchingStatus( null, action ) ).to.be.true; } ); + + test( "should never persist whether it's fetching status", () => { + expect( + fetchingStatus( true, { + type: SERIALIZE, + } ) + ).to.be.null; + + expect( + fetchingStatus( true, { + type: DESERIALIZE, + } ) + ).to.be.false; + } ); } ); } ); } ); diff --git a/client/state/comments/actions.js b/client/state/comments/actions.js index 567dc45c9af76..a3d348fea62ab 100644 --- a/client/state/comments/actions.js +++ b/client/state/comments/actions.js @@ -20,10 +20,18 @@ import { } from '../action-types'; import { NUMBER_OF_COMMENTS_PER_FETCH } from './constants'; -export const requestComment = ( { siteId, commentId } ) => ( { +/** + * Creates an action that requests a single comment for a given site. + * @param {Number} siteId Site identifier + * @param {Number} commentId Comment identifier + * @param {Object} query API call parameters + * @returns {Object} Action that requests a single comment + */ +export const requestComment = ( { siteId, commentId, query = {} } ) => ( { type: COMMENT_REQUEST, siteId, commentId, + query, } ); /*** diff --git a/client/state/current-user/constants.js b/client/state/current-user/constants.js index 110fe5698981c..c866630150387 100644 --- a/client/state/current-user/constants.js +++ b/client/state/current-user/constants.js @@ -1,4 +1,5 @@ /** @format */ export default { DOMAINS_WITH_PLANS_ONLY: 'calypso_domains_with_plans_only', + TRANSFER_IN: 'calypso_transfer_in', }; diff --git a/client/state/data-layer/wpcom-http/README.md b/client/state/data-layer/wpcom-http/README.md index 6c843889fca26..9b72114a45bbc 100644 --- a/client/state/data-layer/wpcom-http/README.md +++ b/client/state/data-layer/wpcom-http/README.md @@ -179,16 +179,22 @@ dispatch( http( { ``` If given, the action passed as the second and optional parameter will take the place of all unspecified `onSuccess`, `onFailure`, and `onProgress` responder events. + Because we have a very common pattern when issuing requests there is a built-in helper to hand each action off to the right function based on the (possibly) attached metadata. ```js import { dispatchRequest } from 'state/data-layer/wpcom-http/utils'; // create request when no meta present, add on success, alert on failure -dispatchRequest( fetchMenu, addMenuItems, alertFailure ); +dispatchRequest( { fetch: fetchMenu, onSuccess: addMenuItems, onError: alertFailure } ); // create request when no meta present, indicate on success, undo on failure, update on progress -dispatchRequest( sendRecipe, indicateSuccess, removeRecipe, { onProgress: updateRecipeProgress } ); +dispatchRequest( { + fetch: sendRecipe, + onSuccess: indicateSuccess, + onError: removeRecipe, + onProgress: updateRecipeProgress +} ); ``` ### `dispatchRequest()` helper @@ -202,7 +208,13 @@ Additionally there are other semantics of network requests it can manage. - A schema to validate the response data and fail invalid formats - A way to indicate data "freshness" or how new data must be to fetch it (coming soon!) -Each of these lifecycle functions will take as arguments the Redux store, the associated action, and the data coming from the response. +Each of these lifecycle functions is in fact an action creator. As arguments, it takes the original +associated action and the data coming from the response. It returns the action we want to be dispatched +when a certain type of API event (request, response, error) happens. If you need to execute more +complex logic in response to an API event, the action creator can return a thunk. Most use cases +just dispatch a single action though, and this case is optimized to require as little code as +possible. + Please note that for this example we have included a progress event even though one would not normally exist for liking posts. Its inclusion here is meant merely to illustrate how the pieces can fit together. @@ -215,77 +227,81 @@ import { QUEUE_REQUEST } from 'state/data-layer/wpcom-http/constants'; /** * @see https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/%24post_ID/likes/new/ API description */ -const likePost = ( { dispatch }, action ) => { - // dispatch intent to issue HTTP request - // by not supplying onSuccess, onError, and onProgress - // _and_ by supplying the second optional `action` - // argument we will be reusing the original action to - // follow-up with these requests, but when it comes - // back it will be wrapped with meta information +const likePost = ( action ) => ( + // dispatch intent to issue HTTP request by not supplying onSuccess, onError, + // and onProgress, but when it comes back it will be wrapped with meta information // describing the response from the HTTP events - dispatch( http( { + // The `dispatchRequest` helper will extend the `http` action with the appropriate + // `onSuccess` and `onError` handlers. Therefore, you don't need to pass the second `action` + // argument to the `http` action creator. + http( { method: 'POST', path: `/sites/{ action.siteId }/posts/${ action.postId }/likes/new`, - + // indicate what should happen if we have // no network connection: queue to replay // when the network reconnects // (not implemented yet) whenOffline: QUEUE_REQUEST, - }, action ) ); -} + } ) +); /** * Called on success from HTTP middleware with `data` parameter * * This is the place to map fromAPI to Calypso formats */ -const verifyLike = ( { dispatch }, { siteId, postId }, data ) => { +const verifyLike = ( { siteId, postId }, data ) => { if ( ! data.hasOwnProperty( 'i_like' ) ) { // something went wrong, so failover - return undoLike( { dispatch }, { siteId, postId }, 'Invalid data' ); + return undoLike( { siteId, postId }, 'Invalid data' ); } // this is a response to data coming in from the data layer, // so skip further data-layer middleware with local - dispatch( bypassDataLayer( { + return bypassDataLayer( { type: data.i_like ? LIKE_POST : UNLIKE_POST, siteId, postId, likeCount: data.like_count, - } ) ); + } ); } /** * Called on failure from the HTTP middleware with `error` parameter */ -const undoLike = ( { dispatch }, { siteId, postId }, error ) => { +const undoLike = ( { siteId, postId }, error ) => ( // skip data-layer middleware - dispatch( bypassDataLayer( { + bypassDataLayer( { type: UNLIKE_POST, siteId, postId, - } ) ); -} + } ) +); /** * Maps progress information from the API into a Calypso-native representation */ -const updateProgress = ( store, { siteId, postId }, progress ) => { - dispatch( { - type: LIKE_POST_PROGRESS, - siteId, - postId, - percentage: 100 * progress.loaded / ( progress.total + Number.EPSILON ) - } ); -} +const updateProgress = ( { siteId, postId }, progress ) => ( { + type: LIKE_POST_PROGRESS, + siteId, + postId, + percentage: 100 * progress.loaded / ( progress.total + Number.EPSILON ) +} ); export default { - // watch for this action -> initiate, onSuccess, onFailure, options: { onProgress } - [ LIKE_POST ]: [ dispatchRequest( likePost, verifyLike, undoLike, { onProgress: updateProgress } ) ], + // watch for this action + [ LIKE_POST ]: [ dispatchRequest( { + fetch: likePost, + onSuccess: verifyLike, + onError: undoLike, + onProgress: updateProgress + } ) ], }; ``` +#### Parsing the response + It's important that perform the mapping stage when handling API request responses to go _from_ the API's native data format _to_ Calypso's native data format. These middleware functions are the perfect place to perform this mapping because it will leave API-specific code separated into specific places that are relatively easy to find. @@ -318,14 +334,48 @@ const toLike = ( { i_like } ) => ( { } ); export default { - [ LIKE_POST ]: [ dispatchRequest( - likePost, // initiate the request - verifyLike, // update the Redux store if need be - undoLike, // remove the like if we failed - { - fromApi: makeParser( likeSchema, {}, toLike ), // validate and convert to internal Calypso object - onProgress: updateProgress, // update progress tracking UI - } - ) ] + [ LIKE_POST ]: [ dispatchRequest( { + fetch: likePost, // initiate the request + onSuccess: verifyLike, // update the Redux store if need be + onError: undoLike, // remove the like if we failed + onProgress: updateProgress, // update progress tracking UI + fromApi: makeParser( likeSchema, {}, toLike ), // validate and convert to internal Calypso object + } ) ] +} +``` + +Of course, not every response is very complicated or warrants a full-blown parser. +Sometimes we just want to determine the failure or success based off of a simple value in the response. +Let's put this together for a fictitious two-factor authentication process. + + +```js +const fromApi = response => { + if ( ! response.hasOwnProperty( 'auth_granted' ) ) { + throw new ValueError( 'Could not understand API response' ); + } + + if ( ! response.auth_granted ) { + throw 'authorization-denied'; + } + + return { + token: response.auth_token, + expiresAt: response.auth_valid_until, + }; } + +dispatchRequest( + fetch2Auth, + approveAuth, + announceAppropriateFailureMessage, + { fromApi }, +) ``` + +In this case we're not only validating the _schema_ of the response data but also the values and deciding +to mark a response as a failure not only when we don't recognize it, but plainly too when the value of the +response indicates that our actual need was a failure. Here we can see that an auth request is a failure +not only if we can't recognize the response, but also if the response indicates that the attempt was a failure. +By incorporating this into the response parser we can keep the logic of Calypso data further separated from +the act of handling network activity. diff --git a/client/state/data-layer/wpcom-http/test/utils.js b/client/state/data-layer/wpcom-http/test/utils.js index 6cde357e17d58..74601eb60b7ee 100644 --- a/client/state/data-layer/wpcom-http/test/utils.js +++ b/client/state/data-layer/wpcom-http/test/utils.js @@ -9,7 +9,14 @@ import { spy } from 'sinon'; /** * Internal dependencies */ -import { getData, getError, getProgress, dispatchRequest, makeParser } from '../utils.js'; +import { + getData, + getError, + getProgress, + dispatchRequest, + dispatchRequestEx, + makeParser, +} from '../utils.js'; describe( 'WPCOM HTTP Data Layer', () => { const withData = data => ( { type: 'SLUGGER', meta: { dataLayer: { data } } } ); @@ -236,4 +243,144 @@ describe( 'WPCOM HTTP Data Layer', () => { expect( onFailure ).to.not.have.been.called; } ); } ); + + describe( '#dispatchRequestEx', () => { + const fetch = () => ( { type: 'REQUEST' } ); + const onSuccess = ( action, data ) => ( { type: 'SUCCESS', data } ); + const onError = ( action, error ) => ( { type: 'FAILURE', error } ); + const onProgress = ( action, progress ) => ( { type: 'PROGRESS', progress } ); + + const dispatcher = dispatchRequestEx( { + fetch, + onSuccess, + onError, + onProgress, + } ); + + const data = { count: 5 }; + const error = { message: 'oh no!' }; + const progress = { loaded: 45, total: 80 }; + + const fetchHttpAction = { type: 'REFILL' }; + const successHttpAction = { type: 'REFILL', meta: { dataLayer: { data } } }; + const failureHttpAction = { type: 'REFILL', meta: { dataLayer: { error } } }; + const progressHttpAction = { type: 'REFILL', meta: { dataLayer: { progress } } }; + const bothHttpAction = { type: 'REFILL', meta: { dataLayer: { data, error } } }; + + const fetchAction = { type: 'REQUEST' }; + const successAction = { type: 'SUCCESS', data }; + const failureAction = { type: 'FAILURE', error }; + const progressAction = { type: 'PROGRESS', progress }; + + let dispatch; + let store; + + beforeEach( () => { + dispatch = spy(); + store = { dispatch }; + } ); + + test( 'should initiate request if meta information missing', () => { + dispatcher( store, fetchHttpAction ); + expect( dispatch ).to.have.been.calledWith( fetchAction ); + } ); + + test( 'should call onSuccess if meta includes response data', () => { + dispatcher( store, successHttpAction ); + expect( dispatch ).to.have.been.calledWith( successAction ); + } ); + + test( 'should call onError if meta includes error data', () => { + dispatcher( store, failureHttpAction ); + expect( dispatch ).to.have.been.calledWith( failureAction ); + } ); + + test( 'should call onError if meta includes both response data and error data', () => { + dispatcher( store, bothHttpAction ); + expect( dispatch ).to.have.been.calledWith( failureAction ); + } ); + + test( 'should call onProgress if meta includes progress data', () => { + dispatcher( store, progressHttpAction ); + expect( dispatch ).to.have.been.calledWith( progressAction ); + } ); + + test( 'should not throw runtime error if onProgress is not specified', () => { + expect( () => { + dispatchRequestEx( { fetch, onSuccess, onError } )( store, progressHttpAction ); + } ).to.not.throw( TypeError ); + } ); + + test( 'should validate response data', () => { + const fromApi = makeParser( { + type: 'object', + properties: { count: { type: 'integer' } }, + } ); + dispatchRequestEx( { fetch, onSuccess, onError, fromApi } )( store, successHttpAction ); + expect( dispatch ).to.have.been.calledWith( successAction ); + } ); + + test( 'should fail-over on invalid response data', () => { + const fromApi = makeParser( { + type: 'object', + properties: { count: { type: 'string' } }, + } ); + dispatchRequestEx( { fetch, onSuccess, onError, fromApi } )( store, successHttpAction ); + expect( dispatch ).to.have.been.calledWithMatch( { type: 'FAILURE' } ); + } ); + + test( 'should validate with additional fields', () => { + const fromApi = makeParser( { + type: 'object', + properties: { count: { type: 'integer' } }, + } ); + + const action = { + type: 'REFILL', + meta: { dataLayer: { data: { count: 15, is_active: true } } }, + }; + + dispatchRequestEx( { fetch, onSuccess, onError, fromApi } )( store, action ); + expect( dispatch ).to.have.been.calledWithMatch( { type: 'SUCCESS' } ); + } ); + + test( 'should filter out additional fields', () => { + const fromApi = makeParser( { + type: 'object', + properties: { count: { type: 'integer' } }, + } ); + + const action = { + type: 'REFILL', + meta: { dataLayer: { data: { count: 15, is_active: true } } }, + }; + + dispatchRequestEx( { fetch, onSuccess, onError, fromApi } )( store, action ); + expect( dispatch ).to.have.been.calledWith( { type: 'SUCCESS', data: { count: 15 } } ); + } ); + + test( 'should transform validated output', () => { + const schema = { + type: 'object', + properties: { count: { type: 'integer' } }, + }; + const transformer = ( { count } ) => ( { tribbleCount: count * 2, haveTrouble: true } ); + const fromApi = makeParser( schema, {}, transformer ); + + const action = { + type: 'REFILL', + meta: { dataLayer: { data: { count: 15, is_active: true } } }, + }; + + dispatchRequestEx( { fetch, onSuccess, onError, fromApi } )( store, action ); + + expect( dispatch ).to.have.been.calledWith( { + type: 'SUCCESS', + data: { + tribbleCount: 30, + haveTrouble: true, + }, + } ); + } ); + } ); } ); diff --git a/client/state/data-layer/wpcom-http/utils.js b/client/state/data-layer/wpcom-http/utils.js index caf19da4238ac..b6bb707cdaac4 100644 --- a/client/state/data-layer/wpcom-http/utils.js +++ b/client/state/data-layer/wpcom-http/utils.js @@ -7,6 +7,11 @@ import schemaValidator from 'is-my-json-valid'; import { get, identity, noop } from 'lodash'; +/** + * Internal dependencies + */ +import warn from 'lib/warn'; + /** * Returns response data from an HTTP request success action if available * @@ -46,18 +51,18 @@ export const getHeaders = action => get( action, 'meta.dataLayer.headers', undef */ export const getProgress = action => get( action, 'meta.dataLayer.progress', undefined ); -class SchemaError extends Error { +export class SchemaError extends Error { constructor( errors ) { super( 'Failed to validate with JSON schema' ); this.schemaErrors = errors; } } -class TransformerError extends Error { - constructor( error, transformer, data ) { +export class TransformerError extends Error { + constructor( error, data, transformer ) { super( error.message ); - this.transformer = transformer; this.inputData = data; + this.transformer = transformer; } } @@ -83,7 +88,7 @@ export const makeParser = ( schema, schemaOptions = {}, transformer = identity ) try { return transformer( data ); } catch ( e ) { - throw new TransformerError( e, transformer, data ); + throw new TransformerError( e, data, transformer ); } }; @@ -161,3 +166,101 @@ export const dispatchRequest = ( initiator, onSuccess, onError, options = {} ) = return initiator( store, action ); }; + +/** + * Dispatches to appropriate function based on HTTP request meta + * + * @see state/data-layer/wpcom-http/actions#fetch creates HTTP requests + * + * When the WPCOM HTTP data layer handles requests it will add + * response data and errors to a meta property on the given success + * error, and progress handling actions. + * + * This function accepts several functions as the fetch, success, error and + * progress handlers for actions and it will call the appropriate + * one based on the stored meta. + * + * These handlers are action creators: based on the input data coming from the HTTP request, + * it will return an action (or an action thunk) to be executed as a response to the given + * HTTP event. + * + * If both error and response data is available this will call the + * error handler in preference over the success handler, but the + * response data will also still be available through the action meta. + * + * The functions should conform to the following type signatures: + * fetch :: Action -> Action (action creator with one Action parameter) + * onSuccess :: Action -> ResponseData -> Action (action creator with two params) + * onError :: Action -> ErrorData -> Action + * onProgress :: Action -> ProgressData -> Action + * fromApi :: ResponseData -> TransformedData throws TransformerError|SchemaError + * + * @param {Object} options object with named parameters: + * @param {Function} fetch called if action lacks response meta; should create HTTP request + * @param {Function} onSuccess called if the action meta includes response data + * @param {Function} onError called if the action meta includes error data + * @param {Function} onProgress called on progress events when uploading + * @param {Function} fromApi maps between API data and Calypso data + * @returns {Action} action or action thunk to be executed in response to HTTP event + */ +export const dispatchRequestEx = options => { + if ( ! options.fetch ) { + warn( 'fetch handler is not defined: no request will ever be issued' ); + } + + if ( ! options.onSuccess ) { + warn( 'onSuccess handler is not defined: response to the request is being ignored' ); + } + + if ( ! options.onError ) { + warn( 'onError handler is not defined: error during the request is being ignored' ); + } + + return ( store, action ) => { + // create the low-level action we want to dispatch + const requestAction = createRequestAction( options, action ); + // dispatch the low level action (if any was created) and return the result + return requestAction ? store.dispatch( requestAction ) : undefined; + }; +}; + +/* + * Converts an application-level Calypso action that's handled by the data-layer middleware + * into a low-level action. For example, HTTP request that's being initiated, or a response + * action with a `meta.dataLayer` property. + */ +function createRequestAction( options, action ) { + const { + fetch = noop, + onSuccess = noop, + onError = noop, + onProgress = noop, + fromApi = identity, + } = options; + + const error = getError( action ); + if ( error ) { + return onError( action, error ); + } + + const data = getData( action ); + if ( data ) { + try { + return onSuccess( action, fromApi( data ) ); + } catch ( err ) { + return onError( action, err ); + } + } + + const progress = getProgress( action ); + if ( progress ) { + return onProgress( action, progress ); + } + + const fetchAction = fetch( action ); + if ( ! fetchAction ) { + warn( "The `fetch` handler didn't return any action: no request will be issued" ); + } + + return fetchAction; +} diff --git a/client/state/data-layer/wpcom/activity-log/get-credentials/index.js b/client/state/data-layer/wpcom/activity-log/get-credentials/index.js new file mode 100644 index 0000000000000..b9f3bbf76d35e --- /dev/null +++ b/client/state/data-layer/wpcom/activity-log/get-credentials/index.js @@ -0,0 +1,56 @@ +/** @format */ +/** + * External dependencies + */ +import i18n from 'i18n-calypso'; + +/** + * Internal dependencies + */ +import { http } from 'state/data-layer/wpcom-http/actions'; +import { dispatchRequest } from 'state/data-layer/wpcom-http/utils'; +import { JETPACK_CREDENTIALS_REQUEST, JETPACK_CREDENTIALS_STORE } from 'state/action-types'; +import { errorNotice } from 'state/notices/actions'; + +export const fetch = ( { dispatch }, action ) => + dispatch( + http( + { + apiVersion: '1.1', + method: 'GET', + path: `/activity-log/${ action.siteId }/get-credentials`, + }, + action + ) + ); + +export const store = ( { dispatch }, action, credentials ) => + dispatch( { + type: JETPACK_CREDENTIALS_STORE, + credentials, + siteId: action.siteId, + } ); + +export const announceFailure = ( { dispatch } ) => + dispatch( + errorNotice( i18n.translate( 'Unexpected problem retrieving credentials. Please try again.' ) ) + ); + +const fromApi = response => { + if ( response.ok ) { + return response.credentials; + } + + // this is an API goof - we get a false value for `ok` instead of an empty list + if ( ! response.ok && response.error === 'No credentials found for this site.' ) { + return {}; + } + + throw new Error( 'Could not obtain credentials' ); +}; + +export default { + [ JETPACK_CREDENTIALS_REQUEST ]: [ + dispatchRequest( fetch, store, announceFailure, { fromApi } ), + ], +}; diff --git a/client/state/data-layer/wpcom/activity-log/index.js b/client/state/data-layer/wpcom/activity-log/index.js index fe1105d024512..21291534e785f 100644 --- a/client/state/data-layer/wpcom/activity-log/index.js +++ b/client/state/data-layer/wpcom/activity-log/index.js @@ -7,6 +7,8 @@ import { mergeHandlers } from 'state/action-watchers/utils'; import activate from './activate'; import deactivate from './deactivate'; +import getCredentials from './get-credentials'; import rewind from './rewind'; +import updateCredentials from './update-credentials'; -export default mergeHandlers( activate, deactivate, rewind ); +export default mergeHandlers( activate, deactivate, getCredentials, rewind, updateCredentials ); diff --git a/client/state/data-layer/wpcom/activity-log/rewind/activate/index.js b/client/state/data-layer/wpcom/activity-log/rewind/activate/index.js new file mode 100644 index 0000000000000..e6aa815f7d4e8 --- /dev/null +++ b/client/state/data-layer/wpcom/activity-log/rewind/activate/index.js @@ -0,0 +1,63 @@ +/** + * External dependencies + * + * @format + */ + +import i18n from 'i18n-calypso'; + +/** + * Internal dependencies + */ +import { http } from 'state/data-layer/wpcom-http/actions'; +import { dispatchRequest } from 'state/data-layer/wpcom-http/utils'; +import { JETPACK_CREDENTIALS_AUTOCONFIGURE, JETPACK_CREDENTIALS_STORE } from 'state/action-types'; +import { successNotice, errorNotice } from 'state/notices/actions'; + +export const fetch = ( { dispatch }, action ) => { + const notice = successNotice( i18n.translate( 'Obtaining your credentials…' ) ); + const { notice: { noticeId } } = notice; + + dispatch( notice ); + + dispatch( + http( + { + apiVersion: '1.1', + method: 'POST', + path: `/activity-log/${ action.siteId }/rewind/activate`, + }, + { ...action, noticeId } + ) + ); +}; + +export const storeAndAnnounce = ( { dispatch }, { siteId, noticeId } ) => { + dispatch( { + type: JETPACK_CREDENTIALS_STORE, + credentials: { main: { type: 'auto' } }, // fake for now until data actually comes through + siteId + } ); + + dispatch( + successNotice( i18n.translate( 'Your credentials have been auto configured.' ), { + duration: 4000, + id: noticeId, + } ) + ); +}; + +export const announceFailure = ( { dispatch }, { noticeId } ) => { + dispatch( + errorNotice( i18n.translate( 'Error auto configuring your credentials.' ), { + duration: 4000, + id: noticeId, + } ) + ); +}; + +export default { + [ JETPACK_CREDENTIALS_AUTOCONFIGURE ]: [ + dispatchRequest( fetch, storeAndAnnounce, announceFailure ), + ], +}; diff --git a/client/state/data-layer/wpcom/activity-log/rewind/index.js b/client/state/data-layer/wpcom/activity-log/rewind/index.js index ad8580a66c360..e94a3b1cff765 100644 --- a/client/state/data-layer/wpcom/activity-log/rewind/index.js +++ b/client/state/data-layer/wpcom/activity-log/rewind/index.js @@ -10,6 +10,7 @@ import { pick } from 'lodash'; * Internal dependencies */ import { mergeHandlers } from 'state/action-watchers/utils'; +import activate from './activate'; import restoreHandler from './to'; import restoreStatusHandler from './restore-status'; import { REWIND_STATUS_REQUEST } from 'state/action-types'; @@ -51,4 +52,4 @@ const statusHandler = { ], }; -export default mergeHandlers( restoreHandler, restoreStatusHandler, statusHandler ); +export default mergeHandlers( activate, restoreHandler, restoreStatusHandler, statusHandler ); diff --git a/client/state/data-layer/wpcom/activity-log/update-credentials/index.js b/client/state/data-layer/wpcom/activity-log/update-credentials/index.js new file mode 100644 index 0000000000000..bf4219168e7ff --- /dev/null +++ b/client/state/data-layer/wpcom/activity-log/update-credentials/index.js @@ -0,0 +1,80 @@ +/** + * External dependencies + * + * @format + */ + +import i18n from 'i18n-calypso'; + +/** + * Internal dependencies + */ +import { http } from 'state/data-layer/wpcom-http/actions'; +import { dispatchRequest } from 'state/data-layer/wpcom-http/utils'; +import { + JETPACK_CREDENTIALS_UPDATE, + JETPACK_CREDENTIALS_UPDATE_SUCCESS, + JETPACK_CREDENTIALS_UPDATE_FAILURE, + JETPACK_CREDENTIALS_STORE, +} from 'state/action-types'; +import { successNotice, errorNotice } from 'state/notices/actions'; + +export const request = ( { dispatch }, action ) => { + const notice = successNotice( i18n.translate( 'Testing connection…' ), { duration: 4000 } ); + const { notice: { noticeId } } = notice; + + dispatch( notice ); + + dispatch( + http( + { + apiVersion: '1.1', + method: 'POST', + path: `/activity-log/${ action.siteId }/update-credentials`, + body: { credentials: action.credentials }, + }, + { ...action, noticeId } + ) + ); +}; + +export const success = ( { dispatch }, action ) => { + dispatch( { + type: JETPACK_CREDENTIALS_UPDATE_SUCCESS, + siteId: action.siteId, + } ); + + dispatch( { + type: JETPACK_CREDENTIALS_STORE, + credentials: { + main: action.credentials, + }, + siteId: action.siteId, + } ); + + dispatch( + successNotice( i18n.translate( 'Your site is now connected.' ), { + duration: 4000, + id: action.noticeId, + } ) + ); +}; + +export const failure = ( { dispatch }, action, error ) => { + dispatch( { + type: JETPACK_CREDENTIALS_UPDATE_FAILURE, + error, + siteId: action.siteId, + } ); + + dispatch( + errorNotice( i18n.translate( 'Error saving. Please check your credentials and try again.' ), { + duration: 4000, + id: action.noticeId, + } ) + ); +}; + +export default { + [ JETPACK_CREDENTIALS_UPDATE ]: [ dispatchRequest( request, success, failure ) ], +}; diff --git a/client/state/data-layer/wpcom/read/index.js b/client/state/data-layer/wpcom/read/index.js index 9a8b0094a85c5..3f64bbb308efa 100644 --- a/client/state/data-layer/wpcom/read/index.js +++ b/client/state/data-layer/wpcom/read/index.js @@ -3,11 +3,13 @@ * Internal dependencies */ import { mergeHandlers } from 'state/action-watchers/utils'; -import site from './site'; -import teams from './teams'; -import tags from './tags'; -import followingMine from './following/mine'; + import feed from './feed'; +import followingMine from './following/mine'; import recommendations from './recommendations'; +import site from './site'; +import sites from './sites'; +import tags from './tags'; +import teams from './teams'; -export default mergeHandlers( site, teams, tags, followingMine, feed, recommendations ); +export default mergeHandlers( feed, followingMine, recommendations, site, sites, tags, teams ); diff --git a/client/state/data-layer/wpcom/read/sites/index.js b/client/state/data-layer/wpcom/read/sites/index.js new file mode 100644 index 0000000000000..fb375b36c1bbd --- /dev/null +++ b/client/state/data-layer/wpcom/read/sites/index.js @@ -0,0 +1,9 @@ +/** @format */ +/** + * Internal Dependencies + */ +import { mergeHandlers } from 'state/action-watchers/utils'; + +import posts from './posts'; + +export default mergeHandlers( posts ); diff --git a/client/state/data-layer/wpcom/read/sites/posts/follow/index.js b/client/state/data-layer/wpcom/read/sites/posts/follow/index.js index e2b3b7e3f2267..24e74ae95eab0 100644 --- a/client/state/data-layer/wpcom/read/sites/posts/follow/index.js +++ b/client/state/data-layer/wpcom/read/sites/posts/follow/index.js @@ -31,7 +31,7 @@ export function requestConversationFollow( { dispatch }, action ) { { method: 'POST', apiNamespace: 'wpcom/v2', - path: `/read/sites/${ action.payload.blogId }/posts/${ action.payload.postId }/follow`, + path: `/read/sites/${ action.payload.siteId }/posts/${ action.payload.postId }/follow`, body: {}, // have to have an empty body to make wpcom-http happy }, actionWithRevert @@ -56,7 +56,7 @@ export function receiveConversationFollow( store, action, response ) { export function receiveConversationFollowError( { dispatch }, - { payload: { blogId, postId }, meta: { previousState } } + { payload: { siteId, postId }, meta: { previousState } } ) { dispatch( errorNotice( @@ -67,8 +67,8 @@ export function receiveConversationFollowError( dispatch( bypassDataLayer( updateConversationFollowStatus( { - blogId: blogId, - postId: postId, + siteId, + postId, followStatus: previousState, } ) ) diff --git a/client/state/data-layer/wpcom/read/sites/posts/follow/test/index.js b/client/state/data-layer/wpcom/read/sites/posts/follow/test/index.js index 210c84fce9303..2a848aec3649f 100644 --- a/client/state/data-layer/wpcom/read/sites/posts/follow/test/index.js +++ b/client/state/data-layer/wpcom/read/sites/posts/follow/test/index.js @@ -21,7 +21,7 @@ describe( 'conversation-follow', () => { describe( 'requestConversationFollow', () => { test( 'should dispatch an http request', () => { const dispatch = jest.fn(); - const action = followConversation( { blogId: 123, postId: 456 } ); + const action = followConversation( { siteId: 123, postId: 456 } ); const actionWithRevert = merge( {}, action, { meta: { previousState: CONVERSATION_FOLLOW_STATUS_MUTING, @@ -48,7 +48,7 @@ describe( 'conversation-follow', () => { receiveConversationFollow( { dispatch }, { - payload: { blogId: 123, postId: 456 }, + payload: { siteId: 123, postId: 456 }, meta: { previousState: CONVERSATION_FOLLOW_STATUS_MUTING }, }, { success: true } @@ -67,7 +67,7 @@ describe( 'conversation-follow', () => { receiveConversationFollow( { dispatch }, { - payload: { blogId: 123, postId: 456 }, + payload: { siteId: 123, postId: 456 }, meta: { previousState: CONVERSATION_FOLLOW_STATUS_MUTING }, }, { @@ -84,7 +84,7 @@ describe( 'conversation-follow', () => { expect( dispatch ).toHaveBeenCalledWith( bypassDataLayer( updateConversationFollowStatus( { - blogId: 123, + siteId: 123, postId: 456, followStatus: CONVERSATION_FOLLOW_STATUS_MUTING, } ) diff --git a/client/state/data-layer/wpcom/read/sites/posts/index.js b/client/state/data-layer/wpcom/read/sites/posts/index.js new file mode 100644 index 0000000000000..47bce366daf35 --- /dev/null +++ b/client/state/data-layer/wpcom/read/sites/posts/index.js @@ -0,0 +1,10 @@ +/** @format */ +/** + * Internal Dependencies + */ +import { mergeHandlers } from 'state/action-watchers/utils'; + +import follow from './follow'; +import mute from './mute'; + +export default mergeHandlers( follow, mute ); diff --git a/client/state/data-layer/wpcom/read/sites/posts/mute/index.js b/client/state/data-layer/wpcom/read/sites/posts/mute/index.js index cba6840a881dd..e944d544cf4d9 100644 --- a/client/state/data-layer/wpcom/read/sites/posts/mute/index.js +++ b/client/state/data-layer/wpcom/read/sites/posts/mute/index.js @@ -14,7 +14,7 @@ import { translate } from 'i18n-calypso'; import { READER_CONVERSATION_MUTE } from 'state/action-types'; import { http } from 'state/data-layer/wpcom-http/actions'; import { dispatchRequest } from 'state/data-layer/wpcom-http/utils'; -import { errorNotice, successNotice } from 'state/notices/actions'; +import { errorNotice, plainNotice } from 'state/notices/actions'; import { updateConversationFollowStatus } from 'state/reader/conversations/actions'; import { bypassDataLayer } from 'state/data-layer/utils'; @@ -31,7 +31,7 @@ export function requestConversationMute( { dispatch }, action ) { { method: 'POST', apiNamespace: 'wpcom/v2', - path: `/read/sites/${ action.payload.blogId }/posts/${ action.payload.postId }/mute`, + path: `/read/sites/${ action.payload.siteId }/posts/${ action.payload.postId }/mute`, body: {}, // have to have an empty body to make wpcom-http happy }, actionWithRevert @@ -48,7 +48,7 @@ export function receiveConversationMute( store, action, response ) { } store.dispatch( - successNotice( translate( 'The conversation has been successfully unfollowed.' ), { + plainNotice( translate( 'The conversation has been successfully unfollowed.' ), { duration: 5000, } ) ); @@ -56,7 +56,7 @@ export function receiveConversationMute( store, action, response ) { export function receiveConversationMuteError( { dispatch }, - { payload: { blogId, postId }, meta: { previousState } } + { payload: { siteId, postId }, meta: { previousState } } ) { dispatch( errorNotice( @@ -67,8 +67,8 @@ export function receiveConversationMuteError( dispatch( bypassDataLayer( updateConversationFollowStatus( { - blogId: blogId, - postId: postId, + siteId, + postId, followStatus: previousState, } ) ) diff --git a/client/state/data-layer/wpcom/read/sites/posts/mute/test/index.js b/client/state/data-layer/wpcom/read/sites/posts/mute/test/index.js index bfba28d1b35b2..f9d152e5fe0f4 100644 --- a/client/state/data-layer/wpcom/read/sites/posts/mute/test/index.js +++ b/client/state/data-layer/wpcom/read/sites/posts/mute/test/index.js @@ -21,7 +21,7 @@ describe( 'conversation-mute', () => { describe( 'requestConversationMute', () => { test( 'should dispatch an http request', () => { const dispatch = jest.fn(); - const action = muteConversation( { blogId: 123, postId: 456 } ); + const action = muteConversation( { siteId: 123, postId: 456 } ); const actionWithRevert = merge( {}, action, { meta: { previousState: CONVERSATION_FOLLOW_STATUS_FOLLOWING, @@ -48,7 +48,7 @@ describe( 'conversation-mute', () => { receiveConversationMute( { dispatch }, { - payload: { blogId: 123, postId: 456 }, + payload: { siteId: 123, postId: 456 }, meta: { previousState: CONVERSATION_FOLLOW_STATUS_FOLLOWING }, }, { success: true } @@ -56,7 +56,7 @@ describe( 'conversation-mute', () => { expect( dispatch ).toHaveBeenCalledWith( expect.objectContaining( { notice: expect.objectContaining( { - status: 'is-success', + status: 'is-plain', } ), } ) ); @@ -67,7 +67,7 @@ describe( 'conversation-mute', () => { receiveConversationMute( { dispatch }, { - payload: { blogId: 123, postId: 456 }, + payload: { siteId: 123, postId: 456 }, meta: { previousState: CONVERSATION_FOLLOW_STATUS_FOLLOWING }, }, { @@ -84,7 +84,7 @@ describe( 'conversation-mute', () => { expect( dispatch ).toHaveBeenCalledWith( bypassDataLayer( updateConversationFollowStatus( { - blogId: 123, + siteId: 123, postId: 456, followStatus: CONVERSATION_FOLLOW_STATUS_FOLLOWING, } ) diff --git a/client/state/data-layer/wpcom/sites/activity/from-api.js b/client/state/data-layer/wpcom/sites/activity/from-api.js index 1009502f73539..deab1f60f387f 100644 --- a/client/state/data-layer/wpcom/sites/activity/from-api.js +++ b/client/state/data-layer/wpcom/sites/activity/from-api.js @@ -53,6 +53,7 @@ export function processItem( item ) { activityIcon: get( item, 'gridicon', DEFAULT_GRIDICON ), activityId: item.activity_id, activityIsRewindable: item.is_rewindable, + rewindId: item.rewind_id, activityName: item.name, activityStatus: item.status, activityTitle: get( item, 'summary', '' ), diff --git a/client/state/data-layer/wpcom/sites/activity/schema.json b/client/state/data-layer/wpcom/sites/activity/schema.json index 6bd779426243c..a5e7bcdf87b83 100644 --- a/client/state/data-layer/wpcom/sites/activity/schema.json +++ b/client/state/data-layer/wpcom/sites/activity/schema.json @@ -60,6 +60,7 @@ "generator": { "type": "object" }, "gridicon": { "type": "string" }, "is_rewindable": { "type": "boolean" }, + "rewind_id": { "type": [ "null", "string" ] }, "items": { "type": "array", "items": { "type": "object" } diff --git a/client/state/data-layer/wpcom/sites/activity/test/from-api.js b/client/state/data-layer/wpcom/sites/activity/test/from-api.js index e6de706beb8d1..09d1a0f0068f9 100644 --- a/client/state/data-layer/wpcom/sites/activity/test/from-api.js +++ b/client/state/data-layer/wpcom/sites/activity/test/from-api.js @@ -45,6 +45,7 @@ const VALID_API_ITEM = deepFreeze( { activity_id: 'foobarbaz', status: 'warning', is_rewindable: false, + rewind_id: 0, } ); describe( 'processItem', () => { @@ -57,6 +58,7 @@ describe( 'processItem', () => { 'activityIcon', 'activityId', 'activityIsRewindable', + 'rewindId', 'activityName', 'activityStatus', 'activityTitle', diff --git a/client/state/data-layer/wpcom/sites/activity/test/index.js b/client/state/data-layer/wpcom/sites/activity/test/index.js index bb8c1b68f95f5..b848b9304020b 100644 --- a/client/state/data-layer/wpcom/sites/activity/test/index.js +++ b/client/state/data-layer/wpcom/sites/activity/test/index.js @@ -53,6 +53,7 @@ const SUCCESS_RESPONSE = deepFreeze( { gridicon: 'posts', activity_id: 'foobarbaz', is_rewindable: false, + rewind_id: 0, }, ], summary: 'Activity log', diff --git a/client/state/data-layer/wpcom/sites/comments/index.js b/client/state/data-layer/wpcom/sites/comments/index.js index c93ae0e197b21..901f76a273e0b 100644 --- a/client/state/data-layer/wpcom/sites/comments/index.js +++ b/client/state/data-layer/wpcom/sites/comments/index.js @@ -26,8 +26,6 @@ import likes from './likes'; import { errorNotice, removeNotice } from 'state/notices/actions'; import { getRawSite } from 'state/sites/selectors'; import { getSiteComment } from 'state/selectors'; -import { getSiteName as getReaderSiteName } from 'reader/get-helpers'; -import { getSite as getReaderSite } from 'state/reader/sites/selectors'; const changeCommentStatus = ( { dispatch, getState }, action ) => { const { siteId, commentId, status } = action; @@ -87,12 +85,13 @@ const announceStatusChangeFailure = ( { dispatch }, action ) => { }; export const requestComment = ( store, action ) => { - const { siteId, commentId } = action; + const { siteId, commentId, query } = action; store.dispatch( http( { method: 'GET', path: `/sites/${ siteId }/comments/${ commentId }`, apiVersion: '1.1', + query, onSuccess: action, onFailure: action, } ) @@ -111,37 +110,12 @@ export const receiveCommentSuccess = ( store, action, response ) => { } ); }; -export const receiveCommentError = ( { dispatch, getState }, { siteId, commentId } ) => { - const site = getReaderSite( getState(), siteId ); - const siteName = getReaderSiteName( { site } ); - - if ( siteName ) { - dispatch( - errorNotice( - translate( 'Failed to retrieve comment for site “%(siteName)s”', { - args: { siteName }, - } ), - { id: `request-comment-error-${ siteId }` } - ) - ); - } else { - const rawSite = getRawSite( getState(), siteId ); - const error = - rawSite && rawSite.name - ? translate( 'Failed to retrieve comment for site “%(siteName)s”', { - args: { siteName: rawSite.name }, - } ) - : translate( 'Failed to retrieve comment for your site' ); - - dispatch( errorNotice( error, { id: `request-comment-error-${ siteId }` } ) ); - } - +export const receiveCommentError = ( { dispatch }, { siteId, commentId } ) => dispatch( { type: COMMENTS_RECEIVE_ERROR, siteId, commentId, } ); -}; // @see https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/comments/ export const fetchCommentsList = ( { dispatch }, action ) => { diff --git a/client/state/data-layer/wpcom/sites/comments/test/index.js b/client/state/data-layer/wpcom/sites/comments/test/index.js index 03f84775804ba..72f66eb476f5d 100644 --- a/client/state/data-layer/wpcom/sites/comments/test/index.js +++ b/client/state/data-layer/wpcom/sites/comments/test/index.js @@ -193,9 +193,8 @@ describe( '#receiveCommentError', () => { receiveCommentError( { dispatch, getState }, action, response ); expect( dispatch ).to.have.been.calledWithMatch( { - notice: { - text: 'Failed to retrieve comment for site “sqeeeeee!”', - }, + siteId, + commentId, } ); } ); } ); diff --git a/client/state/data-layer/wpcom/sites/jitm/index.js b/client/state/data-layer/wpcom/sites/jitm/index.js index da4105f988685..1050dbf92de92 100644 --- a/client/state/data-layer/wpcom/sites/jitm/index.js +++ b/client/state/data-layer/wpcom/sites/jitm/index.js @@ -1,9 +1,9 @@ /** @format */ /** - * External dependencies + * External Dependencies */ -import { get } from 'lodash'; +import { noop, get } from 'lodash'; /** * Internal dependencies @@ -11,9 +11,10 @@ import { get } from 'lodash'; import { dispatchRequest } from 'state/data-layer/wpcom-http/utils'; import { http } from 'state/data-layer/wpcom-http/actions'; import { isJetpackSite } from 'state/sites/selectors'; -import { JITM_SET, SECTION_SET, SELECTED_SITE_SET } from 'state/action-types'; +import { SECTION_SET, SELECTED_SITE_SET, JITM_DISMISS } from 'state/action-types'; import { makeParser } from 'state/data-layer/wpcom-http/utils'; import schema from './schema.json'; +import { clearJITM, insertJITM } from 'state/jitm/actions'; /** * Poor man's process manager @@ -31,10 +32,20 @@ const process = { lastSite: null, }; +/** + * Existing libraries do not escape decimal encoded entities that php encodes, this handles that. + * @param {string} str The string to decode + * @return {string} The decoded string + */ const unescapeDecimalEntities = str => { return str.replace( /&#(\d+);/g, ( match, entity ) => String.fromCharCode( entity ) ); }; +/** + * Given an object from the api, prepare it to be consumed by the ui by transforming the shape of the data + * @param {object} jitms The jitms to display from the api + * @return {object} The transformed data to display + */ const transformApiRequest = ( { data: jitms } ) => jitms.map( jitm => ( { message: unescapeDecimalEntities( jitm.content.message ), @@ -44,13 +55,6 @@ const transformApiRequest = ( { data: jitms } ) => id: jitm.id, } ) ); -const insertJITM = ( dispatch, siteId, messagePath, jitms ) => - dispatch( { - type: JITM_SET, - keyedPath: messagePath + siteId, - jitms: jitms.map( jitm => ( { ...jitm, lastUpdated: Date.now() } ) ), - } ); - /** * Processes the current state and determines if it should fire a jitm request * @param {object} state The current state @@ -88,6 +92,34 @@ export const fetchJITM = ( state, dispatch, action ) => { ); }; +/** + * Dismisses a jitm on the jetpack site, it returns nothing useful and will return no useful error, so we'll + * fail and succeed silently. + * @param {function} dispatch The dispatch function + * @param {object} action The dismissal action + * @return {undefined} + */ +export const doDismissJITM = ( { dispatch }, action ) => + dispatch( + http( + { + apiNamespace: 'rest', + method: 'POST', + path: `/jetpack-blogs/${ action.siteId }/rest-api/`, + query: { + path: '/jetpack/v4/jitm', + body: JSON.stringify( { + feature_class: action.featureClass, + id: action.id, + } ), + http_envelope: 1, + json: false, + }, + }, + action + ) + ); + /** * Called when a route change might have occured * @param {function} getState A function to retrieve the current state @@ -139,20 +171,22 @@ export const handleSiteSelection = ( { getState, dispatch }, action ) => { * @param {number} siteId The site id * @param {object} jitms The jitms * @param {number} site_id The site id + * @param {string} messagePath The jitm message path (ex: calypso:comments:admin_notices) * @return {undefined} Nothing */ export const receiveJITM = ( { dispatch }, { siteId, site_id, messagePath }, jitms ) => - insertJITM( dispatch, siteId || site_id, messagePath, jitms ); + dispatch( insertJITM( siteId || site_id, messagePath, jitms ) ); /** * Called when a jitm fails for any network related reason * @param {function} dispatch The dispatch function * @param {number} siteId The site id * @param {number} site_id The site id + * @param {string} messagePath The jitm message path (ex: calypso:comments:admin_notices) * @return {undefined} Nothing */ export const failedJITM = ( { dispatch }, { siteId, site_id, messagePath } ) => - insertJITM( dispatch, siteId || site_id, messagePath, [] ); + dispatch( clearJITM( siteId || site_id, messagePath ) ); export default { [ SECTION_SET ]: [ @@ -165,4 +199,5 @@ export default { fromApi: makeParser( schema, {}, transformApiRequest ), } ), ], + [ JITM_DISMISS ]: [ dispatchRequest( doDismissJITM, noop, noop, {} ) ], }; diff --git a/client/state/data-layer/wpcom/sites/simple-payments/index.js b/client/state/data-layer/wpcom/sites/simple-payments/index.js index 16e4a8cda6939..f396e2e13f6a6 100644 --- a/client/state/data-layer/wpcom/sites/simple-payments/index.js +++ b/client/state/data-layer/wpcom/sites/simple-payments/index.js @@ -4,7 +4,7 @@ * @format */ -import { filter, toPairs, noop } from 'lodash'; +import { get, noop, toPairs } from 'lodash'; /** * Internal dependencies @@ -17,14 +17,13 @@ import { SIMPLE_PAYMENTS_PRODUCTS_LIST_DELETE, } from 'state/action-types'; import { - receiveProduct, receiveProductsList, receiveUpdateProduct, receiveDeleteProduct, } from 'state/simple-payments/product-list/actions'; import { metaKeyToSchemaKeyMap, metadataSchema } from 'state/simple-payments/product-list/schema'; import { http } from 'state/data-layer/wpcom-http/actions'; -import { dispatchRequest } from 'state/data-layer/wpcom-http/utils'; +import { dispatchRequestEx, TransformerError } from 'state/data-layer/wpcom-http/utils'; import { SIMPLE_PAYMENTS_PRODUCT_POST_TYPE } from 'lib/simple-payments/constants'; import { isValidSimplePaymentsProduct } from 'lib/simple-payments/utils'; import formatCurrency from 'lib/format-currency'; @@ -59,11 +58,15 @@ function customPostMetadataToProductAttributes( metadata ) { } /** - * Formats /posts endpoint response into a product object + * Validates a `/posts` endpoint response and converts it into a product object * @param { Object } customPost raw /post endpoint response to format * @returns { Object } sanitized and formatted product */ export function customPostToProduct( customPost ) { + if ( ! isValidSimplePaymentsProduct( customPost ) ) { + throw new TransformerError( 'Custom post is not a valid simple payment product', customPost ); + } + const metadataAttributes = customPostMetadataToProductAttributes( customPost.metadata ); return { @@ -75,6 +78,26 @@ export function customPostToProduct( customPost ) { }; } +/** + * Extract custom posts array from `responseData`, filter out invalid items and convert the + * valid custom posts to products. + * @param {Object} responseData JSON data with shape `{ posts }` + * @return {Array} validated and converted product list + */ +export function customPostsToProducts( responseData ) { + const posts = get( responseData, 'posts', [] ); + const validProducts = posts + .map( post => { + try { + return customPostToProduct( post ); + } catch ( error ) { + return null; + } + } ) + .filter( Boolean ); + return validProducts; +} + /** * Transforms a product definition object into proper custom post type * @param { Object } product action with product payload @@ -117,143 +140,89 @@ export function productToCustomPost( product ) { }; } -/** - * Issues an API request to fetch a product by its ID for a site. - * - * @param {Object} store Redux store - * @param {Object} action Action object - */ -export function requestSimplePaymentsProduct( { dispatch }, action ) { - const { siteId, productId } = action; +const replaceProductList = ( { siteId }, products ) => receiveProductsList( siteId, products ); +const addOrUpdateProduct = ( { siteId }, newProduct ) => receiveUpdateProduct( siteId, newProduct ); +const deleteProduct = ( { siteId }, deletedPost ) => receiveDeleteProduct( siteId, deletedPost.ID ); - dispatch( +export const handleProductGet = dispatchRequestEx( { + fetch: action => http( { method: 'GET', - path: `/sites/${ siteId }/posts/${ productId }`, + path: `/sites/${ action.siteId }/posts/${ action.productId }`, }, action - ) - ); -} - -/** - * Issues an API request to fetch products for a site. - * - * @param {Object} store Redux store - * @param {Object} action Action object - */ -export function requestSimplePaymentsProducts( { dispatch }, action ) { - const { siteId } = action; - - dispatch( + ), + fromApi: customPostToProduct, + onSuccess: addOrUpdateProduct, + onError: noop, +} ); + +export const handleProductList = dispatchRequestEx( { + fetch: action => http( { method: 'GET', - path: `/sites/${ siteId }/posts`, + path: `/sites/${ action.siteId }/posts`, query: { type: SIMPLE_PAYMENTS_PRODUCT_POST_TYPE, status: 'publish', }, }, action - ) - ); -} - -/** - * Issues an API request to add a new product - * @param {Object} store Redux store - * @param {Object} action Action object - */ -export function requestSimplePaymentsProductAdd( { dispatch }, action ) { - const { siteId, product } = action; - - dispatch( + ), + fromApi: customPostsToProducts, + onSuccess: replaceProductList, + onError: noop, +} ); + +export const handleProductListAdd = dispatchRequestEx( { + fetch: action => http( { method: 'POST', - path: `/sites/${ siteId }/posts/new`, - body: productToCustomPost( product ), + path: `/sites/${ action.siteId }/posts/new`, + body: productToCustomPost( action.product ), }, action - ) - ); -} - -/** - * Issues an API request to edit a product - * @param {Object} store Redux store - * @param {Object} action Action object - */ -export function requestSimplePaymentsProductEdit( { dispatch }, action ) { - const { siteId, product, productId } = action; - - dispatch( + ), + fromApi: customPostToProduct, + onSuccess: addOrUpdateProduct, + onError: noop, +} ); + +export const handleProductListEdit = dispatchRequestEx( { + fetch: action => http( { method: 'POST', - path: `/sites/${ siteId }/posts/${ productId }`, - body: productToCustomPost( product ), + path: `/sites/${ action.siteId }/posts/${ action.productId }`, + body: productToCustomPost( action.product ), }, action - ) - ); -} - -/** - * Issues an API request to delete a product - * @param {Object} store Redux store - * @param {Object} action Action object - */ -export function requestSimplePaymentsProductDelete( { dispatch }, action ) { - const { siteId, productId } = action; - - dispatch( + ), + fromApi: customPostToProduct, + onSuccess: addOrUpdateProduct, + onError: noop, +} ); + +export const handleProductListDelete = dispatchRequestEx( { + fetch: action => http( { method: 'POST', - path: `/sites/${ siteId }/posts/${ productId }/delete`, + path: `/sites/${ action.siteId }/posts/${ action.productId }/delete`, }, action - ) - ); -} - -export const addProduct = ( { dispatch }, { siteId }, newProduct ) => - dispatch( receiveUpdateProduct( siteId, customPostToProduct( newProduct ) ) ); - -export const deleteProduct = ( { dispatch }, { siteId }, deletedProduct ) => - dispatch( receiveDeleteProduct( siteId, deletedProduct.ID ) ); - -export const listProduct = ( { dispatch }, { siteId }, product ) => { - if ( ! isValidSimplePaymentsProduct( product ) ) { - return; - } - - dispatch( receiveProduct( siteId, customPostToProduct( product ) ) ); -}; - -export const listProducts = ( { dispatch }, { siteId }, { posts: products } ) => { - const validProducts = filter( products, isValidSimplePaymentsProduct ); - - dispatch( receiveProductsList( siteId, validProducts.map( customPostToProduct ) ) ); -}; + ), + onSuccess: deleteProduct, + onError: noop, +} ); export default { - [ SIMPLE_PAYMENTS_PRODUCT_GET ]: [ - dispatchRequest( requestSimplePaymentsProduct, listProduct, noop ), - ], - [ SIMPLE_PAYMENTS_PRODUCTS_LIST ]: [ - dispatchRequest( requestSimplePaymentsProducts, listProducts, noop ), - ], - [ SIMPLE_PAYMENTS_PRODUCTS_LIST_ADD ]: [ - dispatchRequest( requestSimplePaymentsProductAdd, addProduct, noop ), - ], - [ SIMPLE_PAYMENTS_PRODUCTS_LIST_EDIT ]: [ - dispatchRequest( requestSimplePaymentsProductEdit, addProduct, noop ), - ], - [ SIMPLE_PAYMENTS_PRODUCTS_LIST_DELETE ]: [ - dispatchRequest( requestSimplePaymentsProductDelete, deleteProduct, noop ), - ], + [ SIMPLE_PAYMENTS_PRODUCT_GET ]: [ handleProductGet ], + [ SIMPLE_PAYMENTS_PRODUCTS_LIST ]: [ handleProductList ], + [ SIMPLE_PAYMENTS_PRODUCTS_LIST_ADD ]: [ handleProductListAdd ], + [ SIMPLE_PAYMENTS_PRODUCTS_LIST_EDIT ]: [ handleProductListEdit ], + [ SIMPLE_PAYMENTS_PRODUCTS_LIST_DELETE ]: [ handleProductListDelete ], }; diff --git a/client/state/data-layer/wpcom/sites/simple-payments/test/index.js b/client/state/data-layer/wpcom/sites/simple-payments/test/index.js index d28e6f2f41a9b..8676626ebbd0c 100644 --- a/client/state/data-layer/wpcom/sites/simple-payments/test/index.js +++ b/client/state/data-layer/wpcom/sites/simple-payments/test/index.js @@ -12,8 +12,9 @@ import { customPostToProduct, productToCustomPost } from '../'; describe( '#simplePayments', () => { test( 'should convert customPost to product', () => { const customPost = { - type: 'jp_pay_product', ID: 1, + type: 'jp_pay_product', + status: 'publish', title: 'The Button', content: 'A very nice button for sale', featured_image: 2, @@ -42,6 +43,8 @@ describe( '#simplePayments', () => { test( 'should decode special characters when converting to product', () => { const customPost = { ID: 2, + type: 'jp_pay_product', + status: 'publish', title: '\u201d\u221e\u201d and ‘so much more’\u2122 \u2026', content: 'Accepting $, \u20bf, & \u2603', featured_image: 2, diff --git a/client/state/happychat/README.md b/client/state/happychat/README.md index 96c3120aa679a..d32d2d2a854d4 100644 --- a/client/state/happychat/README.md +++ b/client/state/happychat/README.md @@ -27,7 +27,7 @@ Happychat state shape: Used in combination with the Redux store instance `dispatch` function, actions can be used in manipulating the current global state. -### `connectChat()` + ### `initConnection()` Opens Happychat Socket.IO client connection. _Note: Most use cases should use the Query Component [``](../../components/happychat/connection.jsx) instead of dispatching @@ -37,6 +37,6 @@ this action directly._ Updates the pending message that the user is composing in the Happychat client. -### `sendChatMessage( message: String )` +### `sendMessage( message: String )` Sends the message as a chat message to the Happychat service. diff --git a/client/state/happychat/chat/actions.js b/client/state/happychat/chat/actions.js deleted file mode 100644 index 1abd8ceff9b00..0000000000000 --- a/client/state/happychat/chat/actions.js +++ /dev/null @@ -1,17 +0,0 @@ -/** @format */ - -/** - * Internal dependencies - */ -import { HAPPYCHAT_SET_CHAT_STATUS } from 'state/action-types'; - -/** - * Returns an action object that sets the current chat status - * - * @param { String } status Current status to be set - * @return { Object } Action object - */ -export const setHappychatChatStatus = status => ( { - type: HAPPYCHAT_SET_CHAT_STATUS, - status, -} ); diff --git a/client/state/happychat/chat/reducer.js b/client/state/happychat/chat/reducer.js index 3ef3345030731..9a6f44a3818ac 100644 --- a/client/state/happychat/chat/reducer.js +++ b/client/state/happychat/chat/reducer.js @@ -14,10 +14,11 @@ import validator from 'is-my-json-valid'; import { SERIALIZE, DESERIALIZE, - HAPPYCHAT_SEND_MESSAGE, - HAPPYCHAT_RECEIVE_EVENT, - HAPPYCHAT_SET_CHAT_STATUS, - HAPPYCHAT_TRANSCRIPT_RECEIVE, + HAPPYCHAT_IO_RECEIVE_MESSAGE, + HAPPYCHAT_IO_RECEIVE_STATUS, + HAPPYCHAT_IO_REQUEST_TRANSCRIPT_RECEIVE, + HAPPYCHAT_IO_REQUEST_TRANSCRIPT_TIMEOUT, + HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE, } from 'state/action-types'; import { HAPPYCHAT_CHAT_STATUS_DEFAULT, @@ -28,8 +29,8 @@ import { timelineSchema } from './schema'; export const lastActivityTimestamp = ( state = null, action ) => { switch ( action.type ) { - case HAPPYCHAT_SEND_MESSAGE: - case HAPPYCHAT_RECEIVE_EVENT: + case HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE: + case HAPPYCHAT_IO_RECEIVE_MESSAGE: return Date.now(); } return state; @@ -54,7 +55,7 @@ lastActivityTimestamp.schema = { type: 'number' }; */ export const status = ( state = HAPPYCHAT_CHAT_STATUS_DEFAULT, action ) => { switch ( action.type ) { - case HAPPYCHAT_SET_CHAT_STATUS: + case HAPPYCHAT_IO_RECEIVE_STATUS: return action.status; } return state; @@ -70,20 +71,20 @@ export const status = ( state = HAPPYCHAT_CHAT_STATUS_DEFAULT, action ) => { */ const timelineEvent = ( state = {}, action ) => { switch ( action.type ) { - case HAPPYCHAT_RECEIVE_EVENT: - const event = action.event; + case HAPPYCHAT_IO_RECEIVE_MESSAGE: + const { message } = action; return Object.assign( {}, { - id: event.id, - source: event.source, - message: event.text, - name: event.user.name, - image: event.user.avatarURL, - timestamp: event.timestamp, - user_id: event.user.id, - type: get( event, 'type', 'message' ), - links: get( event, 'meta.links' ), + id: message.id, + source: message.source, + message: message.text, + name: message.user.name, + image: message.user.avatarURL, + timestamp: message.timestamp, + user_id: message.user.id, + type: get( message, 'type', 'message' ), + links: get( message, 'meta.links' ), } ); } @@ -111,15 +112,17 @@ export const timeline = ( state = [], action ) => { return state; } return []; - case HAPPYCHAT_RECEIVE_EVENT: + case HAPPYCHAT_IO_RECEIVE_MESSAGE: // if meta.forOperator is set, skip so won't show to user - if ( get( action, 'event.meta.forOperator', false ) ) { + if ( get( action, 'message.meta.forOperator', false ) ) { return state; } const event = timelineEvent( {}, action ); const existing = find( state, ( { id } ) => event.id === id ); return existing ? state : concat( state, [ event ] ); - case HAPPYCHAT_TRANSCRIPT_RECEIVE: + case HAPPYCHAT_IO_REQUEST_TRANSCRIPT_TIMEOUT: + return state; + case HAPPYCHAT_IO_REQUEST_TRANSCRIPT_RECEIVE: const messages = filter( action.messages, message => { if ( ! message.id ) { return false; diff --git a/client/state/happychat/chat/test/reducer.js b/client/state/happychat/chat/test/reducer.js index f3c8540118cdd..4549dbd5b13cd 100644 --- a/client/state/happychat/chat/test/reducer.js +++ b/client/state/happychat/chat/test/reducer.js @@ -10,9 +10,9 @@ import { expect } from 'chai'; */ import { lastActivityTimestamp } from '../reducer'; import { - HAPPYCHAT_RECEIVE_EVENT, - HAPPYCHAT_SEND_MESSAGE, - HAPPYCHAT_CONNECTED, + HAPPYCHAT_IO_RECEIVE_INIT, + HAPPYCHAT_IO_RECEIVE_MESSAGE, + HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE, } from 'state/action-types'; // Simulate the time Feb 27, 2017 05:25 UTC @@ -28,18 +28,18 @@ describe( 'reducers', () => { expect( result ).to.be.null; } ); - test( 'should update on certain activity-specific actions', () => { - let result; - - result = lastActivityTimestamp( null, { type: HAPPYCHAT_RECEIVE_EVENT } ); + test( 'should update on HAPPYCHAT_IO_RECEIVE_MESSAGE', () => { + const result = lastActivityTimestamp( null, { type: HAPPYCHAT_IO_RECEIVE_MESSAGE } ); expect( result ).to.equal( NOW ); + } ); - result = lastActivityTimestamp( null, { type: HAPPYCHAT_SEND_MESSAGE } ); + test( 'should update on HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE', () => { + const result = lastActivityTimestamp( null, { type: HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE } ); expect( result ).to.equal( NOW ); } ); test( 'should not update on other actions', () => { - const result = lastActivityTimestamp( null, { type: HAPPYCHAT_CONNECTED } ); + const result = lastActivityTimestamp( null, { type: HAPPYCHAT_IO_RECEIVE_INIT } ); expect( result ).to.equal( null ); } ); } ); diff --git a/client/state/happychat/common.js b/client/state/happychat/common.js deleted file mode 100644 index b864990e658ad..0000000000000 --- a/client/state/happychat/common.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * This is a temporary file to hold common functions while they're being used - * in both actions.js and middleware.js. Once we've finished refactoring - * all side effecting actions into middleware.js, these can be moved there. - * - * @format - */ - -/** - * Internal dependencies - */ -import buildConnection from 'lib/happychat/connection'; - -export const connection = buildConnection(); diff --git a/client/state/happychat/connection/actions.js b/client/state/happychat/connection/actions.js index b9a14058aaaa0..1796eb5ea8016 100644 --- a/client/state/happychat/connection/actions.js +++ b/client/state/happychat/connection/actions.js @@ -1,69 +1,290 @@ /** @format **/ +/** + * External dependencies + */ +import { v4 as uuid } from 'uuid'; + /** * Internal dependencies */ import { - HAPPYCHAT_CONNECT, - HAPPYCHAT_CONNECTED, - HAPPYCHAT_CONNECTING, - HAPPYCHAT_DISCONNECTED, - HAPPYCHAT_INITIALIZE, - HAPPYCHAT_RECEIVE_EVENT, - HAPPYCHAT_RECONNECTING, - HAPPYCHAT_SEND_MESSAGE, - HAPPYCHAT_SEND_USER_INFO, - HAPPYCHAT_SET_AVAILABLE, - HAPPYCHAT_TRANSCRIPT_RECEIVE, - HAPPYCHAT_TRANSCRIPT_REQUEST, + HAPPYCHAT_IO_INIT, + HAPPYCHAT_IO_RECEIVE_ACCEPT, + HAPPYCHAT_IO_RECEIVE_CONNECT, + HAPPYCHAT_IO_RECEIVE_DISCONNECT, + HAPPYCHAT_IO_RECEIVE_ERROR, + HAPPYCHAT_IO_RECEIVE_INIT, + HAPPYCHAT_IO_RECEIVE_MESSAGE, + HAPPYCHAT_IO_RECEIVE_RECONNECTING, + HAPPYCHAT_IO_RECEIVE_STATUS, + HAPPYCHAT_IO_RECEIVE_TOKEN, + HAPPYCHAT_IO_RECEIVE_UNAUTHORIZED, + HAPPYCHAT_IO_REQUEST_TRANSCRIPT_RECEIVE, + HAPPYCHAT_IO_REQUEST_TRANSCRIPT_TIMEOUT, + HAPPYCHAT_IO_REQUEST_TRANSCRIPT, + HAPPYCHAT_IO_SEND_MESSAGE_EVENT, + HAPPYCHAT_IO_SEND_MESSAGE_LOG, + HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE, + HAPPYCHAT_IO_SEND_MESSAGE_USERINFO, + HAPPYCHAT_IO_SEND_PREFERENCES, + HAPPYCHAT_IO_SEND_TYPING, } from 'state/action-types'; +import { HAPPYCHAT_MESSAGE_TYPES } from 'state/happychat/constants'; -export const connectChat = () => ( { type: HAPPYCHAT_CONNECT } ); - -export const initialize = () => ( { type: HAPPYCHAT_INITIALIZE } ); +/** + * Returns an action object indicating that the connection is being stablished. + * + * @param { Promise } auth Authentication promise, will return the user info upon fulfillment + * @return { Object } Action object + */ +export const initConnection = auth => ( { type: HAPPYCHAT_IO_INIT, auth } ); -export const setConnected = user => ( { type: HAPPYCHAT_CONNECTED, user } ); +/** + * Returns an action object for the connect event, + * as it was received from Happychat. + * + * @return { Object } Action object + */ +export const receiveConnect = () => ( { type: HAPPYCHAT_IO_RECEIVE_CONNECT } ); -export const setConnecting = () => ( { type: HAPPYCHAT_CONNECTING } ); +/** + * Returns an action object for the disconnect event, + * as it was received from Happychat. + * + * @param { String } error The error + * @return { Object } Action object + */ +export const receiveDisconnect = error => ( { + type: HAPPYCHAT_IO_RECEIVE_DISCONNECT, + error, +} ); -export const setDisconnected = errorStatus => ( { type: HAPPYCHAT_DISCONNECTED, errorStatus } ); +/** + * Returns an action object for the token event, + * as it was received from Happychat. + * + * @return { Object } Action object + */ +export const receiveToken = () => ( { type: HAPPYCHAT_IO_RECEIVE_TOKEN } ); -export const setReconnecting = () => ( { type: HAPPYCHAT_RECONNECTING } ); +/** + * Returns an action object for the init event, as received from Happychat. + * Indicates that the connection is ready to be used. + * + * @param { Object } user User object received + * @return { Object } Action object + */ +export const receiveInit = user => ( { type: HAPPYCHAT_IO_RECEIVE_INIT, user } ); -export const setHappychatAvailable = isAvailable => ( { - type: HAPPYCHAT_SET_AVAILABLE, - isAvailable, +/** + * Returns an action object for the unauthorized event, + * as it was received from Happychat + * + * @param { String } error Error reported + * @return { Object } Action object + */ +export const receiveUnauthorized = error => ( { + type: HAPPYCHAT_IO_RECEIVE_UNAUTHORIZED, + error, } ); -export const sendChatMessage = ( message, meta ) => ( { - type: HAPPYCHAT_SEND_MESSAGE, - message, - meta, +/** + * Returns an action object for the reconnecting event, + * as it was received from Happychat. + * + * @return { Object } Action object + */ +export const receiveReconnecting = () => ( { type: HAPPYCHAT_IO_RECEIVE_RECONNECTING } ); + +/** + * Returns an action object for the accept event indicating the system availability, + * as it was received from Happychat. + * + * @param { Object } isAvailable Whether Happychat is available + * @return { Object } Action object + */ +export const receiveAccept = isAvailable => ( { + type: HAPPYCHAT_IO_RECEIVE_ACCEPT, + isAvailable, } ); /** - * Returns an action object that sends information about the customer to happychat + * Returns an action object for the message event, + * as it was received from Happychat. * - * @param { String } howCanWeHelp Selected value of `How can we help?` form input - * @param { String } howYouFeel Selected value of `Mind sharing how you feel?` form input - * @param { Object } site Selected site info + * @param { Object } message Message received * @return { Object } Action object */ -export const sendUserInfo = ( howCanWeHelp, howYouFeel, site ) => { - return { - type: HAPPYCHAT_SEND_USER_INFO, - howCanWeHelp, - howYouFeel, - site, - }; -}; +export const receiveMessage = message => ( { type: HAPPYCHAT_IO_RECEIVE_MESSAGE, message } ); -export const receiveChatEvent = event => ( { type: HAPPYCHAT_RECEIVE_EVENT, event } ); +/** + * Returns an action object for the status event, + * as it was received from Happychat. + * + * @param { String } status New chat status + * @return { Object } Action object + */ +export const receiveStatus = status => ( { + type: HAPPYCHAT_IO_RECEIVE_STATUS, + status, +} ); -export const requestChatTranscript = () => ( { type: HAPPYCHAT_TRANSCRIPT_REQUEST } ); +/** + * Returns an action object with the error received from Happychat + * upon trying to send an event. + * + * @param { Object } error Error received + * @return { Object } Action object + */ +export const receiveError = error => ( { type: HAPPYCHAT_IO_RECEIVE_ERROR, error } ); -export const receiveChatTranscript = ( messages, timestamp ) => ( { - type: HAPPYCHAT_TRANSCRIPT_RECEIVE, +/** + * Returns an action object for the transcript reception. + * + * @param { Object } result An object with {messages, timestamp} props + * @return { Object } Action object + */ +export const receiveTranscript = ( { messages, timestamp } ) => ( { + type: HAPPYCHAT_IO_REQUEST_TRANSCRIPT_RECEIVE, messages, timestamp, } ); + +/** + * Returns an action object for the timeout of the transcript request. + * + * @return { Object } Action object + */ +export const receiveTranscriptTimeout = () => ( { + type: HAPPYCHAT_IO_REQUEST_TRANSCRIPT_TIMEOUT, +} ); + +/** + * Returns an action object that prepares the transcript request + * to be send to happychat as a SocketIO event. + * + * @param { String } timestamp Latest transcript timestamp + * @param { Number } timeout The number of milliseconds to wait for server response. + * If it hasn't responded after the timeout, the connection library + * will dispatch the receiveTranscriptTimeout action. + * @return { Object } Action object + */ +export const requestTranscript = ( timestamp, timeout = 10000 ) => ( { + type: HAPPYCHAT_IO_REQUEST_TRANSCRIPT, + event: 'transcript', + payload: timestamp, + timeout: timeout, + callback: receiveTranscript, + callbackTimeout: receiveTranscriptTimeout, +} ); + +/** + * Returns an action object that prepares the chat message + * to be send to Happychat as a SocketIO event. + * + * @param { Object } message Message to be sent + * @param { Object } meta meta info to be sent along the message + * @return { Object } Action object + */ +export const sendMessage = ( message, meta = {} ) => ( { + type: HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE, + event: 'message', + payload: { id: uuid(), text: message, meta }, +} ); + +/** + * Returns an action object that prepares the event message + * to be send to Happychat as a SocketIO event. + * + * @param { Object } message Message to be sent + * @return { Object } Action object + */ +export const sendEvent = message => ( { + type: HAPPYCHAT_IO_SEND_MESSAGE_EVENT, + event: 'message', + payload: { + id: uuid(), + text: message, + type: HAPPYCHAT_MESSAGE_TYPES.CUSTOMER_EVENT, + meta: { forOperator: true, event_type: HAPPYCHAT_MESSAGE_TYPES.CUSTOMER_EVENT }, + }, +} ); + +/** + * Returns an action object that prepares the log message + * to be send to Happychat as a SocketIO event. + * + * @param { Object } message Message to be sent + * @return { Object } Action object + */ +export const sendLog = message => ( { + type: HAPPYCHAT_IO_SEND_MESSAGE_LOG, + event: 'message', + payload: { + id: uuid(), + text: message, + type: HAPPYCHAT_MESSAGE_TYPES.LOG, + meta: { forOperator: true, event_type: HAPPYCHAT_MESSAGE_TYPES.LOG }, + }, +} ); + +/** + * Returns an action object that prepares the user information + * to be send to Happychat as a SocketIO event. + * + * @param { Object } info Selected user info + * @return { Object } Action object + */ +export const sendUserInfo = info => ( { + type: HAPPYCHAT_IO_SEND_MESSAGE_USERINFO, + event: 'message', + payload: { + id: uuid(), + type: HAPPYCHAT_MESSAGE_TYPES.CUSTOMER_INFO, + meta: { + forOperator: true, + ...info, + }, + }, +} ); + +/** + * Returns an action object that prepares the typing info + * to be sent to Happychat as a SocketIO event. + * + * @param { Object } message What the user is typing + * @return { Object } Action object + */ +export const sendTyping = message => ( { + type: HAPPYCHAT_IO_SEND_TYPING, + event: 'typing', + payload: { + message, + }, +} ); + +/** + * Returns an action object that prepares typing info (the user stopped typing) + * to be sent to Happychat as a SocketIO event. + * + * @return { Object } Action object + */ +export const sendNotTyping = () => sendTyping( false ); + +/** + * Returns an action object that prepares the user routing preferences (locale and groups) + * to be send to happychat as a SocketIO event. + * + * @param { String } locale representing the user selected locale + * @param { Array } groups of string happychat groups (wp.com, jpop) based on the site selected + * @return { Object } Action object + */ +export const sendPreferences = ( locale, groups ) => ( { + type: HAPPYCHAT_IO_SEND_PREFERENCES, + event: 'preferences', + payload: { + locale, + groups, + }, +} ); diff --git a/client/state/happychat/connection/reducer.js b/client/state/happychat/connection/reducer.js index a93442b327a38..d0f39658dd8ba 100644 --- a/client/state/happychat/connection/reducer.js +++ b/client/state/happychat/connection/reducer.js @@ -3,27 +3,27 @@ * Internal dependencies */ import { - HAPPYCHAT_SET_AVAILABLE, - HAPPYCHAT_CONNECTING, - HAPPYCHAT_CONNECTED, - HAPPYCHAT_DISCONNECTED, - HAPPYCHAT_RECONNECTING, + HAPPYCHAT_IO_INIT, + HAPPYCHAT_IO_RECEIVE_ACCEPT, + HAPPYCHAT_IO_RECEIVE_DISCONNECT, + HAPPYCHAT_IO_RECEIVE_INIT, + HAPPYCHAT_IO_RECEIVE_RECONNECTING, } from 'state/action-types'; import { - HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED, - HAPPYCHAT_CONNECTION_STATUS_CONNECTING, HAPPYCHAT_CONNECTION_STATUS_CONNECTED, + HAPPYCHAT_CONNECTION_STATUS_CONNECTING, HAPPYCHAT_CONNECTION_STATUS_DISCONNECTED, HAPPYCHAT_CONNECTION_STATUS_RECONNECTING, + HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED, } from 'state/happychat/constants'; import { combineReducers } from 'state/utils'; const error = ( state = null, action ) => { switch ( action.type ) { - case HAPPYCHAT_CONNECTED: + case HAPPYCHAT_IO_RECEIVE_INIT: return null; - case HAPPYCHAT_DISCONNECTED: - return action.errorStatus; + case HAPPYCHAT_IO_RECEIVE_DISCONNECT: + return action.error; } return state; }; @@ -38,13 +38,13 @@ const error = ( state = null, action ) => { */ const status = ( state = HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED, action ) => { switch ( action.type ) { - case HAPPYCHAT_CONNECTING: + case HAPPYCHAT_IO_INIT: return HAPPYCHAT_CONNECTION_STATUS_CONNECTING; - case HAPPYCHAT_CONNECTED: + case HAPPYCHAT_IO_RECEIVE_INIT: return HAPPYCHAT_CONNECTION_STATUS_CONNECTED; - case HAPPYCHAT_DISCONNECTED: + case HAPPYCHAT_IO_RECEIVE_DISCONNECT: return HAPPYCHAT_CONNECTION_STATUS_DISCONNECTED; - case HAPPYCHAT_RECONNECTING: + case HAPPYCHAT_IO_RECEIVE_RECONNECTING: return HAPPYCHAT_CONNECTION_STATUS_RECONNECTING; } return state; @@ -59,7 +59,7 @@ const status = ( state = HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED, action ) => */ const isAvailable = ( state = false, action ) => { switch ( action.type ) { - case HAPPYCHAT_SET_AVAILABLE: + case HAPPYCHAT_IO_RECEIVE_ACCEPT: return action.isAvailable; } return state; diff --git a/client/state/happychat/connection/test/actions.js b/client/state/happychat/connection/test/actions.js index 2841743c881ca..32e426be2e3c4 100644 --- a/client/state/happychat/connection/test/actions.js +++ b/client/state/happychat/connection/test/actions.js @@ -8,16 +8,16 @@ import { expect } from 'chai'; /** * Internal dependencies */ -import { HAPPYCHAT_CONNECTED } from 'state/action-types'; -import { setConnected } from '../actions'; +import { HAPPYCHAT_IO_RECEIVE_INIT } from 'state/action-types'; +import { receiveInit } from '../actions'; describe( 'actions', () => { - describe( '#setConnected()', () => { + describe( '#receiveInit()', () => { test( 'should return an action object', () => { - const action = setConnected( { geoLocation: { country_long: 'Romania' } } ); + const action = receiveInit( { geoLocation: { country_long: 'Romania' } } ); expect( action ).to.eql( { - type: HAPPYCHAT_CONNECTED, + type: HAPPYCHAT_IO_RECEIVE_INIT, user: { geoLocation: { country_long: 'Romania' } }, } ); } ); diff --git a/client/state/happychat/constants.js b/client/state/happychat/constants.js index 83a3af5032bcb..34265fa318296 100644 --- a/client/state/happychat/constants.js +++ b/client/state/happychat/constants.js @@ -12,6 +12,7 @@ export const HAPPYCHAT_CONNECTION_STATUS_CONNECTING = 'connecting'; export const HAPPYCHAT_CONNECTION_STATUS_CONNECTED = 'connected'; export const HAPPYCHAT_CONNECTION_STATUS_DISCONNECTED = 'disconnected'; export const HAPPYCHAT_CONNECTION_STATUS_RECONNECTING = 'reconnecting'; +export const HAPPYCHAT_CONNECTION_STATUS_UNAUTHORIZED = 'unauthorized'; // Max number of messages to save between refreshes export const HAPPYCHAT_MAX_STORED_MESSAGES = 30; diff --git a/client/state/happychat/middleware-calypso.js b/client/state/happychat/middleware-calypso.js new file mode 100644 index 0000000000000..d2e26afaafc08 --- /dev/null +++ b/client/state/happychat/middleware-calypso.js @@ -0,0 +1,155 @@ +/** @format */ + +/** + * External dependencies + */ +import { has, noop } from 'lodash'; + +/** + * Internal dependencies + */ +import { + ANALYTICS_EVENT_RECORD, + HELP_CONTACT_FORM_SITE_SELECT, + ROUTE_SET, + COMMENTS_CHANGE_STATUS, + EXPORT_COMPLETE, + EXPORT_FAILURE, + EXPORT_STARTED, + IMPORTS_IMPORT_START, + JETPACK_CONNECT_AUTHORIZE, + MEDIA_DELETE, + PLUGIN_ACTIVATE_REQUEST, + PLUGIN_SETUP_ACTIVATE, + POST_SAVE_SUCCESS, + PUBLICIZE_CONNECTION_CREATE, + PUBLICIZE_CONNECTION_DELETE, + PURCHASE_REMOVE_COMPLETED, + SITE_SETTINGS_SAVE_SUCCESS, +} from 'state/action-types'; +import { sendEvent, sendLog, sendPreferences } from 'state/happychat/connection/actions'; +import { getGroups } from './selectors'; +import isHappychatChatAssigned from 'state/happychat/selectors/is-happychat-chat-assigned'; +import isHappychatClientConnected from 'state/happychat/selectors/is-happychat-client-connected'; +import { getCurrentUser, getCurrentUserLocale } from 'state/current-user/selectors'; + +const getRouteSetMessage = ( state, action ) => { + const currentUser = getCurrentUser( state ); + return `Looking at https://wordpress.com${ action.path }?support_user=${ currentUser.username }`; +}; + +export const getEventMessageFromActionData = action => { + // Below we've stubbed in the actions we think we'll care about, so that we can + // start incrementally adding messages for them. + switch ( action.type ) { + case COMMENTS_CHANGE_STATUS: + return `Changed a comment's status to "${ action.status }"`; + case EXPORT_COMPLETE: + return 'Export completed'; + case EXPORT_FAILURE: + return `Export failed: ${ action.error.message }`; + case EXPORT_STARTED: + return 'Started an export'; + case IMPORTS_IMPORT_START: // This one seems not to fire at all. + return null; + case JETPACK_CONNECT_AUTHORIZE: + return null; + case MEDIA_DELETE: // This one seems not to fire at all. + return null; + case PLUGIN_ACTIVATE_REQUEST: + return null; + case PLUGIN_SETUP_ACTIVATE: + return null; + case POST_SAVE_SUCCESS: + return `Saved post "${ action.savedPost.title }" ${ action.savedPost.short_URL }`; + case PUBLICIZE_CONNECTION_CREATE: + return `Connected ${ action.connection.label } sharing`; + case PUBLICIZE_CONNECTION_DELETE: + return `Disconnected ${ action.connection.label } sharing`; + case PURCHASE_REMOVE_COMPLETED: + return null; + case SITE_SETTINGS_SAVE_SUCCESS: + return 'Saved site settings'; + } + return null; +}; + +export const getEventMessageFromTracksData = ( { name, properties } ) => { + switch ( name ) { + case 'calypso_add_new_wordpress_click': + return 'Clicked "Add new site" button'; + case 'calypso_domain_search_add_button_click': + return `Clicked "Add" button to add domain "${ properties.domain_name }"`; + case 'calypso_domain_remove_button_click': + return `Clicked "Remove" button to remove domain "${ properties.domain_name }"`; + case 'calypso_themeshowcase_theme_activate': + return `Changed theme from "${ properties.previous_theme }" to "${ properties.theme }"`; + case 'calypso_editor_featured_image_upload': + return 'Changed the featured image on the current post'; + case 'calypso_map_domain_step_add_domain_click': + return `Add "${ properties.domain_name }" to the cart in the "Map a domain" step`; + } + return null; +}; + +export const sendAnalyticsLogEvent = ( dispatch, { meta: { analytics: analyticsMeta } } ) => { + analyticsMeta.forEach( ( { type, payload: { service, name, properties } } ) => { + if ( type === ANALYTICS_EVENT_RECORD && service === 'tracks' ) { + // Check if this event should generate a timeline event, and send it if so + const eventMessage = getEventMessageFromTracksData( { name, properties } ); + if ( eventMessage ) { + // Once we want these events to appear in production we should change this to sendEvent + dispatch( sendEvent( eventMessage ) ); + } + + // Always send a log for every tracks event + dispatch( sendLog( name ) ); + } + } ); +}; + +export const sendActionLogsAndEvents = ( { getState, dispatch }, action ) => { + const state = getState(); + + // If there's not an active Happychat session, do nothing + if ( ! isHappychatClientConnected( state ) || ! isHappychatChatAssigned( state ) ) { + return; + } + + // If there's analytics metadata attached to this action, send analytics events + if ( has( action, 'meta.analytics' ) ) { + sendAnalyticsLogEvent( dispatch, action ); + } + + // Check if this action should generate a timeline event, and send it if so + const eventMessage = getEventMessageFromActionData( action ); + if ( eventMessage ) { + // Once we want these events to appear in production we should change this to sendEvent + dispatch( sendEvent( eventMessage ) ); + } +}; + +export default store => next => action => { + const state = store.getState(); + const { dispatch } = store; + + // Send any relevant log/event data from this action to Happychat + sendActionLogsAndEvents( store, action ); + + switch ( action.type ) { + case HELP_CONTACT_FORM_SITE_SELECT: + isHappychatClientConnected( state ) + ? dispatch( + sendPreferences( getCurrentUserLocale( state ), getGroups( state, action.siteId ) ) + ) + : noop; + break; + + case ROUTE_SET: + isHappychatClientConnected( state ) && isHappychatChatAssigned( state ) + ? dispatch( sendEvent( getRouteSetMessage( state, action ) ) ) + : noop; + break; + } + return next( action ); +}; diff --git a/client/state/happychat/middleware.js b/client/state/happychat/middleware.js index 2012426f4e2cc..1485378e351fa 100644 --- a/client/state/happychat/middleware.js +++ b/client/state/happychat/middleware.js @@ -1,355 +1,74 @@ +/** @format */ + /** * External dependencies - * - * @format */ - -import moment from 'moment'; -import { has, isEmpty, throttle } from 'lodash'; +import { noop } from 'lodash'; /** * Internal dependencies */ -import config from 'config'; -import wpcom from 'lib/wp'; import { - ANALYTICS_EVENT_RECORD, - HAPPYCHAT_CONNECT, - HAPPYCHAT_INITIALIZE, - HAPPYCHAT_SEND_USER_INFO, - HAPPYCHAT_SEND_MESSAGE, - HAPPYCHAT_SET_CURRENT_MESSAGE, - HAPPYCHAT_TRANSCRIPT_REQUEST, - HELP_CONTACT_FORM_SITE_SELECT, - ROUTE_SET, - COMMENTS_CHANGE_STATUS, - EXPORT_COMPLETE, - EXPORT_FAILURE, - EXPORT_STARTED, HAPPYCHAT_BLUR, HAPPYCHAT_FOCUS, - IMPORTS_IMPORT_START, - JETPACK_CONNECT_AUTHORIZE, - MEDIA_DELETE, - PLUGIN_ACTIVATE_REQUEST, - PLUGIN_SETUP_ACTIVATE, - POST_SAVE_SUCCESS, - PUBLICIZE_CONNECTION_CREATE, - PUBLICIZE_CONNECTION_DELETE, - PURCHASE_REMOVE_COMPLETED, - SITE_SETTINGS_SAVE_SUCCESS, + HAPPYCHAT_IO_INIT, + HAPPYCHAT_IO_REQUEST_TRANSCRIPT, + HAPPYCHAT_IO_SEND_MESSAGE_EVENT, + HAPPYCHAT_IO_SEND_MESSAGE_LOG, + HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE, + HAPPYCHAT_IO_SEND_MESSAGE_USERINFO, + HAPPYCHAT_IO_SEND_PREFERENCES, + HAPPYCHAT_IO_SEND_TYPING, } from 'state/action-types'; -import { receiveChatTranscript } from './connection/actions'; -import { getGroups } from './selectors'; -import getGeoLocation from 'state/happychat/selectors/get-geolocation'; -import isHappychatChatAssigned from 'state/happychat/selectors/is-happychat-chat-assigned'; +import { sendEvent } from 'state/happychat/connection/actions'; +import buildConnection from 'lib/happychat/connection'; import isHappychatClientConnected from 'state/happychat/selectors/is-happychat-client-connected'; -import isHappychatConnectionUninitialized from 'state/happychat/selectors/is-happychat-connection-uninitialized'; -import wasHappychatRecentlyActive from 'state/happychat/selectors/was-happychat-recently-active'; -import { getCurrentUser, getCurrentUserLocale } from 'state/current-user/selectors'; -import { getHelpSelectedSite } from 'state/help/selectors'; -import debugFactory from 'debug'; -const debug = debugFactory( 'calypso:happychat:actions' ); - -const sendTyping = throttle( - ( connection, message ) => { - connection.typing( message ); - }, - 1000, - { leading: true, trailing: false } -); - -// Promise based interface for wpcom.request -const request = ( ...args ) => - new Promise( ( resolve, reject ) => { - wpcom.request( ...args, ( error, response ) => { - if ( error ) { - return reject( error ); - } - resolve( response ); - } ); - } ); - -const sign = payload => - request( { - method: 'POST', - path: '/jwt/sign', - body: { payload: JSON.stringify( payload ) }, - } ); - -const startSession = () => - request( { - method: 'POST', - path: '/happychat/session', - } ); - -export const updateChatPreferences = ( connection, { getState }, siteId ) => { - const state = getState(); - - if ( isHappychatClientConnected( state ) ) { - const locale = getCurrentUserLocale( state ); - const groups = getGroups( state, siteId ); - - connection.setPreferences( locale, groups ); - } -}; - -export const connectChat = ( connection, { getState, dispatch } ) => { - const state = getState(); - if ( ! isHappychatConnectionUninitialized( state ) ) { - // If chat has already initialized, do nothing - return; - } - - const url = config( 'happychat_url' ); - - const user = getCurrentUser( state ); - const locale = getCurrentUserLocale( state ); - let groups = getGroups( state ); - const selectedSite = getHelpSelectedSite( state ); - if ( selectedSite && selectedSite.ID ) { - groups = getGroups( state, selectedSite.ID ); - } - - const happychatUser = { - signer_user_id: user.ID, - locale, - groups, - }; - - return startSession() - .then( ( { session_id, geo_location } ) => { - happychatUser.geoLocation = geo_location; - return sign( { user, session_id } ); - } ) - .then( ( { jwt } ) => connection.init( url, dispatch, { jwt, ...happychatUser } ) ) - .catch( e => debug( 'failed to start Happychat session', e, e.stack ) ); -}; - -export const requestTranscript = ( connection, { dispatch } ) => { - debug( 'requesting current session transcript' ); - - // passing a null timestamp will request the latest session's transcript - return connection - .transcript( null ) - .then( - result => dispatch( receiveChatTranscript( result.messages, result.timestamp ) ), - e => debug( 'failed to get transcript', e ) - ); -}; - -const onMessageChange = ( connection, message ) => { - if ( isEmpty( message ) ) { - connection.notTyping(); - } else { - sendTyping( connection, message ); - } -}; - -const sendMessage = ( connection, { message, meta } ) => { - debug( 'sending message', message ); - connection.send( message, meta ); - connection.notTyping(); -}; - -export const sendInfo = ( connection, { getState }, action ) => { - const { howCanWeHelp, howYouFeel, site } = action; - const info = { - howCanWeHelp, - howYouFeel, - siteId: site.ID, - siteUrl: site.URL, - localDateTime: moment().format( 'h:mm a, MMMM Do YYYY' ), - }; - - // add screen size - if ( 'object' === typeof screen ) { - info.screenSize = { - width: screen.width, - height: screen.height, - }; - } - - // add browser size - if ( 'object' === typeof window ) { - info.browserSize = { - width: window.innerWidth, - height: window.innerHeight, - }; - } - - // add user agent - if ( 'object' === typeof navigator ) { - info.userAgent = navigator.userAgent; - } - - // add geo location - const state = getState(); - const geoLocation = getGeoLocation( state ); - if ( geoLocation ) { - info.geoLocation = geoLocation; - } - - debug( 'sending info message', info ); - connection.sendInfo( info ); -}; - -export const connectIfRecentlyActive = ( connection, store ) => { - if ( wasHappychatRecentlyActive( store.getState() ) ) { - return connectChat( connection, store ); - } - return Promise.resolve(); // for testing purposes we need to return a promise -}; - -export const sendRouteSetEventMessage = ( connection, { getState }, action ) => { - const state = getState(); - const currentUser = getCurrentUser( state ); - if ( isHappychatClientConnected( state ) && isHappychatChatAssigned( state ) ) { - connection.sendEvent( - `Looking at https://wordpress.com${ action.path }?support_user=${ currentUser.username }` - ); - } -}; - -export const getEventMessageFromActionData = action => { - // Below we've stubbed in the actions we think we'll care about, so that we can - // start incrementally adding messages for them. - switch ( action.type ) { - case COMMENTS_CHANGE_STATUS: - return `Changed a comment's status to "${ action.status }"`; - case EXPORT_COMPLETE: - return 'Export completed'; - case EXPORT_FAILURE: - return `Export failed: ${ action.error.message }`; - case EXPORT_STARTED: - return 'Started an export'; - case HAPPYCHAT_BLUR: - return 'Stopped looking at Happychat'; - case HAPPYCHAT_FOCUS: - return 'Started looking at Happychat'; - case IMPORTS_IMPORT_START: // This one seems not to fire at all. - return null; - case JETPACK_CONNECT_AUTHORIZE: - return null; - case MEDIA_DELETE: // This one seems not to fire at all. - return null; - case PLUGIN_ACTIVATE_REQUEST: - return null; - case PLUGIN_SETUP_ACTIVATE: - return null; - case POST_SAVE_SUCCESS: - return `Saved post "${ action.savedPost.title }" ${ action.savedPost.short_URL }`; - case PUBLICIZE_CONNECTION_CREATE: - return `Connected ${ action.connection.label } sharing`; - case PUBLICIZE_CONNECTION_DELETE: - return `Disconnected ${ action.connection.label } sharing`; - case PURCHASE_REMOVE_COMPLETED: - return null; - case SITE_SETTINGS_SAVE_SUCCESS: - return 'Saved site settings'; - } - return null; -}; - -export const getEventMessageFromTracksData = ( { name, properties } ) => { - switch ( name ) { - case 'calypso_add_new_wordpress_click': - return 'Clicked "Add new site" button'; - case 'calypso_domain_search_add_button_click': - return `Clicked "Add" button to add domain "${ properties.domain_name }"`; - case 'calypso_domain_remove_button_click': - return `Clicked "Remove" button to remove domain "${ properties.domain_name }"`; - case 'calypso_themeshowcase_theme_activate': - return `Changed theme from "${ properties.previous_theme }" to "${ properties.theme }"`; - case 'calypso_editor_featured_image_upload': - return 'Changed the featured image on the current post'; - case 'calypso_map_domain_step_add_domain_click': - return `Add "${ properties.domain_name }" to the cart in the "Map a domain" step`; - } - return null; -}; - -export const sendAnalyticsLogEvent = ( connection, { meta: { analytics: analyticsMeta } } ) => { - analyticsMeta.forEach( ( { type, payload: { service, name, properties } } ) => { - if ( type === ANALYTICS_EVENT_RECORD && service === 'tracks' ) { - // Check if this event should generate a timeline event, and send it if so - const eventMessage = getEventMessageFromTracksData( { name, properties } ); - if ( eventMessage ) { - // Once we want these events to appear in production we should change this to sendEvent - connection.sendEvent( eventMessage ); - } - - // Always send a log for every tracks event - connection.sendLog( name ); - } - } ); -}; - -export const sendActionLogsAndEvents = ( connection, { getState }, action ) => { - const state = getState(); - - // If there's not an active Happychat session, do nothing - if ( ! isHappychatClientConnected( state ) || ! isHappychatChatAssigned( state ) ) { - return; - } - - // If there's analytics metadata attached to this action, send analytics events - if ( has( action, 'meta.analytics' ) ) { - sendAnalyticsLogEvent( connection, action ); - } +import isHappychatChatAssigned from 'state/happychat/selectors/is-happychat-chat-assigned'; - // Check if this action should generate a timeline event, and send it if so - const eventMessage = getEventMessageFromActionData( action ); - if ( eventMessage ) { - // Once we want these events to appear in production we should change this to sendEvent - connection.sendEvent( eventMessage ); - } +const eventMessage = { + HAPPYCHAT_BLUR: 'Stopped looking at Happychat', + HAPPYCHAT_FOCUS: 'Started looking at Happychat', }; -export default function( connection = null ) { +export const socketMiddleware = ( connection = null ) => { // Allow a connection object to be specified for // testing. If blank, use a real connection. if ( connection == null ) { - connection = require( './common' ).connection; + connection = buildConnection(); } return store => next => action => { - // Send any relevant log/event data from this action to Happychat - sendActionLogsAndEvents( connection, store, action ); - switch ( action.type ) { - case HAPPYCHAT_CONNECT: - connectChat( connection, store ); - break; - - case HAPPYCHAT_INITIALIZE: - connectIfRecentlyActive( connection, store ); + case HAPPYCHAT_IO_INIT: + connection.init( store.dispatch, action.auth ); break; - case HELP_CONTACT_FORM_SITE_SELECT: - updateChatPreferences( connection, store, action.siteId ); + case HAPPYCHAT_IO_REQUEST_TRANSCRIPT: + connection.request( action, action.timeout ); break; - case HAPPYCHAT_SEND_USER_INFO: - sendInfo( connection, store, action ); + case HAPPYCHAT_IO_SEND_MESSAGE_EVENT: + case HAPPYCHAT_IO_SEND_MESSAGE_LOG: + case HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE: + case HAPPYCHAT_IO_SEND_MESSAGE_USERINFO: + case HAPPYCHAT_IO_SEND_PREFERENCES: + case HAPPYCHAT_IO_SEND_TYPING: + connection.send( action ); break; - case HAPPYCHAT_SEND_MESSAGE: - sendMessage( connection, action ); - break; - - case HAPPYCHAT_SET_CURRENT_MESSAGE: - onMessageChange( connection, action.message ); - break; - - case HAPPYCHAT_TRANSCRIPT_REQUEST: - requestTranscript( connection, store ); - break; - - case ROUTE_SET: - sendRouteSetEventMessage( connection, store, action ); + case HAPPYCHAT_BLUR: + case HAPPYCHAT_FOCUS: + const state = store.getState(); + isHappychatClientConnected( state ) && + isHappychatChatAssigned( state ) && + eventMessage[ action.type ] + ? store.dispatch( sendEvent( eventMessage[ action.type ] ) ) + : noop; break; } + return next( action ); }; -} +}; + +export default socketMiddleware(); diff --git a/client/state/happychat/selectors/get-happychat-userinfo.js b/client/state/happychat/selectors/get-happychat-userinfo.js new file mode 100644 index 0000000000000..5f814e5c8a35a --- /dev/null +++ b/client/state/happychat/selectors/get-happychat-userinfo.js @@ -0,0 +1,48 @@ +/** @format */ +/** + * External dependencies + */ +import moment from 'moment'; + +/** + * Internal dependencies + */ +import getGeoLocation from 'state/happychat/selectors/get-geolocation'; + +export default state => ( { site, howCanWeHelp, howYouFeel } ) => { + const info = { + howCanWeHelp, + howYouFeel, + siteId: site.ID, + siteUrl: site.URL, + localDateTime: moment().format( 'h:mm a, MMMM Do YYYY' ), + }; + + // add screen size + if ( 'object' === typeof screen ) { + info.screenSize = { + width: screen.width, + height: screen.height, + }; + } + + // add browser size + if ( 'object' === typeof window ) { + info.browserSize = { + width: window.innerWidth, + height: window.innerHeight, + }; + } + + // add user agent + if ( 'object' === typeof navigator ) { + info.userAgent = navigator.userAgent; + } + + const geoLocation = getGeoLocation( state ); + if ( geoLocation ) { + info.geoLocation = geoLocation; + } + + return info; +}; diff --git a/client/state/happychat/selectors/test/get-happychat-userinfo.js b/client/state/happychat/selectors/test/get-happychat-userinfo.js new file mode 100644 index 0000000000000..4e18d7c6cddb7 --- /dev/null +++ b/client/state/happychat/selectors/test/get-happychat-userinfo.js @@ -0,0 +1,78 @@ +/** @format */ + +/** + * External dependencies + */ +import moment from 'moment'; + +/** + * Internal dependencies + */ +import getUserInfo from 'state/happychat/selectors/get-happychat-userinfo'; + +describe( 'HAPPYCHAT_IO_SEND_MESSAGE_USERINFO action', () => { + const state = { + happychat: { + user: { + geoLocation: { + city: 'Timisoara', + }, + }, + }, + }; + + const previousWindow = global.window; + const previousScreen = global.screen; + const previousNavigator = global.navigator; + + beforeAll( () => { + global.window = { + innerWidth: 'windowInnerWidth', + innerHeight: 'windowInnerHeight', + }; + global.screen = { + width: 'screenWidth', + height: 'screenHeight', + }; + global.navigator = { + userAgent: 'navigatorUserAgent', + }; + } ); + + afterAll( () => { + global.window = previousWindow; + global.screen = previousScreen; + global.navigator = previousNavigator; + } ); + + test( 'should send relevant browser information to the connection', () => { + const expectedInfo = { + howCanWeHelp: 'howCanWeHelp', + howYouFeel: 'howYouFeel', + siteId: 'siteId', + siteUrl: 'siteUrl', + localDateTime: moment().format( 'h:mm a, MMMM Do YYYY' ), + screenSize: { + width: 'screenWidth', + height: 'screenHeight', + }, + browserSize: { + width: 'windowInnerWidth', + height: 'windowInnerHeight', + }, + userAgent: 'navigatorUserAgent', + geoLocation: state.happychat.user.geoLocation, + }; + + const userInfo = getUserInfo( state )( { + site: { + ID: 'siteId', + URL: 'siteUrl', + }, + howCanWeHelp: 'howCanWeHelp', + howYouFeel: 'howYouFeel', + } ); + + expect( userInfo ).toEqual( expectedInfo ); + } ); +} ); diff --git a/client/state/happychat/test/middleware-calypso.js b/client/state/happychat/test/middleware-calypso.js new file mode 100644 index 0000000000000..938251f3f5099 --- /dev/null +++ b/client/state/happychat/test/middleware-calypso.js @@ -0,0 +1,293 @@ +/** @format */ + +/** + * External dependencies + */ +import deepFreeze from 'deep-freeze'; + +/** + * Internal dependencies + */ +import middleware, { + sendActionLogsAndEvents, + sendAnalyticsLogEvent, + getEventMessageFromTracksData, +} from '../middleware-calypso'; +import { selectSiteId } from 'state/help/actions'; +import { setRoute } from 'state/ui/actions'; +import { getCurrentUserLocale } from 'state/current-user/selectors'; +import { getGroups } from 'state/happychat/selectors'; +import { sendPreferences } from 'state/happychat/connection/actions'; +import { + HAPPYCHAT_CHAT_STATUS_ASSIGNED, + HAPPYCHAT_CHAT_STATUS_DEFAULT, + HAPPYCHAT_CHAT_STATUS_PENDING, + HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED, + HAPPYCHAT_CONNECTION_STATUS_CONNECTED, + HAPPYCHAT_CONNECTION_STATUS_DISCONNECTED, +} from 'state/happychat/constants'; +import { + ANALYTICS_EVENT_RECORD, + HAPPYCHAT_IO_SEND_MESSAGE_EVENT, + HAPPYCHAT_IO_SEND_MESSAGE_LOG, + SITE_SETTINGS_SAVE_SUCCESS, +} from 'state/action-types'; + +describe( 'middleware', () => { + let actionMiddleware, store; + beforeEach( () => { + store = { + getState: jest.fn(), + dispatch: jest.fn(), + }; + + actionMiddleware = middleware( store )( jest.fn() ); + } ); + + describe( 'Calypso actions are converted to SocketIO actions', () => { + describe( 'HELP_CONTACT_FORM_SITE_SELECT', () => { + test( 'should dispatch a sendPreferences action if happychat client is connected', () => { + const state = { + happychat: { + connection: { status: HAPPYCHAT_CONNECTION_STATUS_CONNECTED }, + }, + currentUser: { + locale: 'en', + capabilities: {}, + }, + sites: { + items: { + 1: { ID: 1 }, + }, + }, + ui: { + section: { + name: 'reader', + }, + }, + }; + store.getState.mockReturnValue( state ); + const action = selectSiteId( state.sites.items[ 1 ].ID ); + actionMiddleware( action ); + expect( store.dispatch ).toHaveBeenCalledWith( + sendPreferences( getCurrentUserLocale( state ), getGroups( state, action.siteId ) ) + ); + } ); + + test( 'should not dispatch a sendPreferences action if there is no happychat connection', () => { + const state = { + currentUser: { + locale: 'en', + capabilities: {}, + }, + sites: { + items: { + 1: { ID: 1 }, + }, + }, + }; + store.getState.mockReturnValue( state ); + const action = selectSiteId( state.sites.items[ 1 ].ID ); + actionMiddleware( action ); + expect( store.dispatch ).not.toHaveBeenCalled(); + } ); + } ); + + describe( 'ROUTE_SET', () => { + const action = setRoute( '/me' ); + + let state; + beforeEach( () => { + state = { + currentUser: { + id: '2', + }, + users: { + items: { + 2: { username: 'Link' }, + }, + }, + happychat: { + connection: { + status: HAPPYCHAT_CONNECTION_STATUS_CONNECTED, + isAvailable: true, + }, + chat: { status: HAPPYCHAT_CHAT_STATUS_ASSIGNED }, + }, + }; + + store.getState.mockReturnValue( state ); + } ); + + test( 'should dispatch a sendEvent action if client connected and chat assigned', () => { + actionMiddleware( action ); + expect( store.dispatch.mock.calls[ 0 ][ 0 ].payload.text ).toBe( + 'Looking at https://wordpress.com/me?support_user=Link' + ); + } ); + + test( 'should not dispatch a sendEvent action if client is not connected', () => { + state.happychat.connection.status = HAPPYCHAT_CONNECTION_STATUS_DISCONNECTED; + actionMiddleware( action ); + expect( store.dispatch ).not.toHaveBeenCalled(); + } ); + + test( 'should not dispatch a sendEvent action if chat is not assigned', () => { + state.happychat.chat.status = HAPPYCHAT_CHAT_STATUS_PENDING; + actionMiddleware( action ); + expect( store.dispatch ).not.toHaveBeenCalled(); + } ); + } ); + } ); + + describe( '#sendAnalyticsLogEvent', () => { + test( 'should ignore non-tracks analytics recordings', () => { + const analyticsMeta = [ + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'ga' } }, + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'fb' } }, + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'adwords' } }, + ]; + sendAnalyticsLogEvent( store.dispatch, { meta: { analytics: analyticsMeta } } ); + + expect( store.dispatch ).not.toHaveBeenCalled(); + } ); + + test( 'should send log events for all listed tracks events', () => { + const analyticsMeta = [ + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'ga' } }, + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'abc' } }, + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'adwords' } }, + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'def' } }, + ]; + sendAnalyticsLogEvent( store.dispatch, { meta: { analytics: analyticsMeta } } ); + + expect( store.dispatch ).toHaveBeenCalledTimes( 2 ); + expect( store.dispatch.mock.calls[ 0 ][ 0 ].payload.text ).toBe( 'abc' ); + expect( store.dispatch.mock.calls[ 1 ][ 0 ].payload.text ).toBe( 'def' ); + } ); + + test( 'should only send a timeline event for whitelisted tracks events', () => { + const analyticsMeta = [ + { + type: ANALYTICS_EVENT_RECORD, + payload: { service: 'tracks', name: 'calypso_add_new_wordpress_click' }, + }, + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'abc' } }, + { + type: ANALYTICS_EVENT_RECORD, + payload: { + service: 'tracks', + name: 'calypso_themeshowcase_theme_activate', + properties: {}, + }, + }, + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'def' } }, + ]; + sendAnalyticsLogEvent( store.dispatch, { meta: { analytics: analyticsMeta } } ); + + expect( store.dispatch.mock.calls[ 0 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_EVENT ); + expect( store.dispatch.mock.calls[ 1 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_LOG ); + expect( store.dispatch.mock.calls[ 2 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_LOG ); + expect( store.dispatch.mock.calls[ 3 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_EVENT ); + expect( store.dispatch.mock.calls[ 4 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_LOG ); + expect( store.dispatch.mock.calls[ 5 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_LOG ); + + expect( store.dispatch ).toHaveBeenCalledTimes( 6 ); + expect( store.dispatch.mock.calls[ 0 ][ 0 ].payload.text ).toBe( + getEventMessageFromTracksData( analyticsMeta[ 0 ].payload ) + ); + expect( store.dispatch.mock.calls[ 3 ][ 0 ].payload.text ).toBe( + getEventMessageFromTracksData( analyticsMeta[ 2 ].payload ) + ); + } ); + } ); + + describe( '#sendActionLogsAndEvents', () => { + const assignedState = deepFreeze( { + happychat: { + connection: { status: HAPPYCHAT_CONNECTION_STATUS_CONNECTED }, + chat: { status: HAPPYCHAT_CHAT_STATUS_ASSIGNED }, + }, + } ); + const unassignedState = deepFreeze( { + happychat: { + connection: { status: HAPPYCHAT_CONNECTION_STATUS_CONNECTED }, + chat: { status: HAPPYCHAT_CHAT_STATUS_DEFAULT }, + }, + } ); + const unconnectedState = deepFreeze( { + happychat: { + connection: { status: HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED }, + chat: { status: HAPPYCHAT_CHAT_STATUS_DEFAULT }, + }, + } ); + + test( "should not send events if there's no Happychat connection", () => { + const action = { + type: SITE_SETTINGS_SAVE_SUCCESS, + meta: { + analytics: [ + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'abc' } }, + ], + }, + }; + store.getState.mockReturnValue( unconnectedState ); + sendActionLogsAndEvents( store, action ); + + expect( store.dispatch ).not.toHaveBeenCalled(); + } ); + + test( 'should not send log events if the Happychat connection is unassigned', () => { + const action = { + type: SITE_SETTINGS_SAVE_SUCCESS, + meta: { + analytics: [ + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'abc' } }, + ], + }, + }; + store.getState.mockReturnValue( unassignedState ); + sendActionLogsAndEvents( store, action ); + + expect( store.dispatch ).not.toHaveBeenCalled(); + } ); + + test( 'should send matching events when Happychat is connected and assigned', () => { + const action = { + type: SITE_SETTINGS_SAVE_SUCCESS, + meta: { + analytics: [ + { + type: ANALYTICS_EVENT_RECORD, + payload: { service: 'tracks', name: 'calypso_add_new_wordpress_click' }, + }, + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'abc' } }, + { + type: ANALYTICS_EVENT_RECORD, + payload: { + service: 'tracks', + name: 'calypso_themeshowcase_theme_activate', + properties: {}, + }, + }, + { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'def' } }, + ], + }, + }; + store.getState.mockReturnValue( assignedState ); + sendActionLogsAndEvents( store, action ); + + // All 4 analytics records will be sent to the "firehose" log + // The two whitelisted analytics events and the SITE_SETTINGS_SAVE_SUCCESS itself + // will be sent as customer events + expect( store.dispatch ).toHaveBeenCalledTimes( 7 ); + expect( store.dispatch.mock.calls[ 0 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_EVENT ); + expect( store.dispatch.mock.calls[ 1 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_LOG ); + expect( store.dispatch.mock.calls[ 2 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_LOG ); + expect( store.dispatch.mock.calls[ 3 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_EVENT ); + expect( store.dispatch.mock.calls[ 4 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_LOG ); + expect( store.dispatch.mock.calls[ 5 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_LOG ); + expect( store.dispatch.mock.calls[ 6 ][ 0 ].type ).toBe( HAPPYCHAT_IO_SEND_MESSAGE_EVENT ); + } ); + } ); +} ); diff --git a/client/state/happychat/test/middleware.js b/client/state/happychat/test/middleware.js index ceb5845631cfe..1ea83015dd939 100644 --- a/client/state/happychat/test/middleware.js +++ b/client/state/happychat/test/middleware.js @@ -1,568 +1,196 @@ /** @format */ -/** - * External dependencies - */ -import { expect } from 'chai'; -import deepFreeze from 'deep-freeze'; -import { noop } from 'lodash'; -import moment from 'moment'; -import { spy, stub } from 'sinon'; - /** * Internal dependencies */ -import middleware, { - connectChat, - connectIfRecentlyActive, +import { socketMiddleware as middleware } from '../middleware'; +import { + initConnection, requestTranscript, - sendActionLogsAndEvents, - sendAnalyticsLogEvent, - sendRouteSetEventMessage, - updateChatPreferences, - sendInfo, -} from '../middleware'; + sendEvent, + sendLog, + sendMessage, + sendUserInfo, + sendPreferences, + sendTyping, + sendNotTyping, +} from 'state/happychat/connection/actions'; +import { blur, focus } from 'state/happychat/ui/actions'; import { + HAPPYCHAT_CHAT_STATUS_ABANDONED, HAPPYCHAT_CHAT_STATUS_ASSIGNED, + HAPPYCHAT_CHAT_STATUS_ASSIGNING, + HAPPYCHAT_CHAT_STATUS_BLOCKED, + HAPPYCHAT_CHAT_STATUS_CLOSED, HAPPYCHAT_CHAT_STATUS_DEFAULT, + HAPPYCHAT_CHAT_STATUS_MISSED, + HAPPYCHAT_CHAT_STATUS_NEW, HAPPYCHAT_CHAT_STATUS_PENDING, - HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED, HAPPYCHAT_CONNECTION_STATUS_CONNECTED, HAPPYCHAT_CONNECTION_STATUS_CONNECTING, -} from '../constants'; -import wpcom from 'lib/wp'; -import { - ANALYTICS_EVENT_RECORD, - HAPPYCHAT_BLUR, - HAPPYCHAT_SEND_USER_INFO, - HAPPYCHAT_SEND_MESSAGE, - HAPPYCHAT_SET_CURRENT_MESSAGE, - HAPPYCHAT_TRANSCRIPT_RECEIVE, -} from 'state/action-types'; -import { useSandbox } from 'test/helpers/use-sinon'; + HAPPYCHAT_CONNECTION_STATUS_DISCONNECTED, + HAPPYCHAT_CONNECTION_STATUS_RECONNECTING, + HAPPYCHAT_CONNECTION_STATUS_UNAUTHORIZED, + HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED, +} from 'state/happychat/constants'; describe( 'middleware', () => { - describe( 'HAPPYCHAT_CONNECT action', () => { - // TODO: Add tests for cases outside the happy path - let connection; - let dispatch, getState; - const uninitializedState = deepFreeze( { - currentUser: { id: 1, capabilities: {} }, - happychat: { connection: { status: HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED } }, - users: { items: { 1: {} } }, - help: { selectedSiteId: 2647731 }, - sites: { - items: { - 2647731: { - ID: 2647731, - name: 'Manual Automattic Updates', - }, - }, - }, - ui: { - section: { - name: 'reader', - }, - }, - } ); - - useSandbox( sandbox => { - connection = { - init: sandbox.stub().returns( Promise.resolve() ), - }; - dispatch = sandbox.stub(); - getState = sandbox.stub(); - sandbox.stub( wpcom, 'request', ( args, callback ) => callback( null, {} ) ); - } ); - - test( 'should not attempt to connect when Happychat has been initialized', () => { - const connectedState = { - happychat: { connection: { status: HAPPYCHAT_CONNECTION_STATUS_CONNECTED } }, - }; - const connectingState = { - happychat: { connection: { status: HAPPYCHAT_CONNECTION_STATUS_CONNECTING } }, - }; - - return Promise.all( [ - connectChat( connection, { dispatch, getState: getState.returns( connectedState ) } ), - connectChat( connection, { dispatch, getState: getState.returns( connectingState ) } ), - ] ).then( () => expect( connection.init ).not.to.have.been.called ); - } ); - - test( 'should attempt to connect when Happychat is uninitialized', () => { - getState.returns( uninitializedState ); - return connectChat( connection, { dispatch, getState } ).then( () => { - expect( connection.init ).to.have.been.calledOnce; - } ); - } ); - } ); - - describe( 'HAPPYCHAT_SEND_USER_INFO action', () => { - const state = { - happychat: { - user: { - geoLocation: { - city: 'Timisoara', - }, - }, - }, + let actionMiddleware, connection, store; + beforeEach( () => { + connection = { + init: jest.fn(), + send: jest.fn(), + request: jest.fn(), }; - const previousWindow = global.window; - const previousScreen = global.screen; - const previousNavigator = global.navigator; - - beforeAll( () => { - global.window = { - innerWidth: 'windowInnerWidth', - innerHeight: 'windowInnerHeight', - }; - global.screen = { - width: 'screenWidth', - height: 'screenHeight', - }; - global.navigator = { - userAgent: 'navigatorUserAgent', - }; - } ); - - afterAll( () => { - global.window = previousWindow; - global.screen = previousScreen; - global.navigator = previousNavigator; - } ); - - test( 'should send relevant browser information to the connection', () => { - const expectedInfo = { - howCanWeHelp: 'howCanWeHelp', - howYouFeel: 'howYouFeel', - siteId: 'siteId', - siteUrl: 'siteUrl', - localDateTime: moment().format( 'h:mm a, MMMM Do YYYY' ), - screenSize: { - width: 'screenWidth', - height: 'screenHeight', - }, - browserSize: { - width: 'windowInnerWidth', - height: 'windowInnerHeight', - }, - userAgent: 'navigatorUserAgent', - geoLocation: state.happychat.user.geoLocation, - }; + store = { + getState: jest.fn(), + dispatch: jest.fn(), + }; - const getState = () => state; - const connection = { sendInfo: spy() }; - const action = { - type: HAPPYCHAT_SEND_USER_INFO, - site: { - ID: 'siteId', - URL: 'siteUrl', - }, - howCanWeHelp: 'howCanWeHelp', - howYouFeel: 'howYouFeel', - }; - sendInfo( connection, { getState }, action ); + actionMiddleware = middleware( connection )( store )( jest.fn() ); + } ); - expect( connection.sendInfo ).to.have.been.calledOnce; - expect( connection.sendInfo ).to.have.been.calledWithMatch( expectedInfo ); + describe( 'connection.init actions are connected', () => { + test( 'HAPPYCHAT_IO_INIT', () => { + const action = initConnection( jest.fn() ); + actionMiddleware( action ); + expect( connection.init ).toHaveBeenCalledWith( store.dispatch, action.auth ); } ); } ); - describe( 'HAPPYCHAT_INITIALIZE action', () => { - // TODO: This test is only complicated because connectIfRecentlyActive calls - // connectChat directly, and since both are in the same module we can't stub - // connectChat. So we need to build up all the objects to make connectChat execute - // without errors. It may be worth pulling each of these helpers out into their - // own modules, so that we can stub them and simplify our tests. - const recentlyActiveState = deepFreeze( { - currentUser: { id: 1, capabilities: {} }, - happychat: { - connection: { status: HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED }, - lastActivityTimestamp: Date.now(), - }, - users: { items: { 1: {} } }, - help: { selectedSiteId: 2647731 }, - sites: { - items: { - 2647731: { - ID: 2647731, - name: 'Manual Automattic Updates', - }, - }, - }, - ui: { - section: { - name: 'reader', - }, - }, + describe( 'connection.send actions are connected', () => { + test( 'HAPPYCHAT_IO_SEND_MESSAGE_EVENT', () => { + const action = sendEvent( 'msg' ); + actionMiddleware( action ); + expect( connection.send ).toHaveBeenCalledWith( action ); } ); - const storeRecentlyActive = { - dispatch: noop, - getState: stub().returns( recentlyActiveState ), - }; - const notRecentlyActiveState = deepFreeze( { - currentUser: { id: 1, capabilities: {} }, - happychat: { - connection: { status: HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED }, - lastActivityTimestamp: null, // no record of last activity - }, - users: { items: { 1: {} } }, - help: { selectedSiteId: 2647731 }, - sites: { - items: { - 2647731: { - ID: 2647731, - name: 'Manual Automattic Updates', - }, - }, - }, - ui: { - section: { - name: 'reader', - }, - }, + test( 'HAPPYCHAT_IO_SEND_MESSAGE_LOG', () => { + const action = sendLog( 'msg' ); + actionMiddleware( action ); + expect( connection.send ).toHaveBeenCalledWith( action ); } ); - const storeNotRecentlyActive = { - dispatch: noop, - getState: stub().returns( notRecentlyActiveState ), - }; - let connection; - useSandbox( sandbox => { - connection = { - init: sandbox.stub().returns( Promise.resolve() ), - }; - sandbox.stub( wpcom, 'request', ( args, callback ) => callback( null, {} ) ); + test( 'HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE', () => { + const action = sendMessage( 'msg' ); + actionMiddleware( action ); + expect( connection.send ).toHaveBeenCalledWith( action ); } ); - test( 'should connect the chat if user was recently connected', () => { - connectIfRecentlyActive( connection, storeRecentlyActive ).then( () => { - expect( connection.init ).to.have.been.called; - } ); + test( 'HAPPYCHAT_IO_SEND_MESSAGE_USERINFO', () => { + const action = sendUserInfo( { user: 'user' } ); + actionMiddleware( action ); + expect( connection.send ).toHaveBeenCalledWith( action ); } ); - test( 'should not connect the chat if user was not recently connected', () => { - connectIfRecentlyActive( connection, storeNotRecentlyActive ).then( () => { - expect( connection.init ).to.not.have.been.called; - } ); + test( 'HAPPYCHAT_IO_SEND_MESSAGE_PREFERENCES', () => { + const action = sendPreferences( 'locale', [] ); + actionMiddleware( action ); + expect( connection.send ).toHaveBeenCalledWith( action ); } ); - } ); - describe( 'HAPPYCHAT_SEND_MESSAGE action', () => { - test( 'should send the message through the connection and send a notTyping signal', () => { - const action = { type: HAPPYCHAT_SEND_MESSAGE, message: 'Hello world' }; - const connection = { - send: spy(), - notTyping: spy(), - }; - middleware( connection )( { getState: noop } )( noop )( action ); - expect( connection.send ).to.have.been.calledWith( action.message ); - expect( connection.notTyping ).to.have.been.calledOnce; + test( 'HAPPYCHAT_IO_SEND_MESSAGE_TYPING (sendTyping)', () => { + const action = sendTyping( 'msg' ); + actionMiddleware( action ); + expect( connection.send ).toHaveBeenCalledWith( action ); } ); - } ); - describe( 'HAPPYCHAT_SET_CURRENT_MESSAGE action', () => { - test( 'should send the connection a typing signal when a message is present', () => { - const action = { type: HAPPYCHAT_SET_CURRENT_MESSAGE, message: 'Hello world' }; - const connection = { typing: spy() }; - middleware( connection )( { getState: noop } )( noop )( action ); - expect( connection.typing ).to.have.been.calledWith( action.message ); - } ); - test( 'should send the connection a notTyping signal when the message is blank', () => { - const action = { type: HAPPYCHAT_SET_CURRENT_MESSAGE, message: '' }; - const connection = { notTyping: spy() }; - middleware( connection )( { getState: noop } )( noop )( action ); - expect( connection.notTyping ).to.have.been.calledOnce; + test( 'HAPPYCHAT_IO_SEND_MESSAGE_TYPING (sendNotTyping)', () => { + const action = sendNotTyping( 'msg' ); + actionMiddleware( action ); + expect( connection.send ).toHaveBeenCalledWith( action ); } ); } ); - describe( 'HAPPYCHAT_TRANSCRIPT_REQUEST action', () => { - test( 'should fetch transcript from connection and dispatch receive action', () => { - const state = deepFreeze( { - happychat: { - chat: { timeline: [] }, - }, - } ); - const response = { - messages: [ { text: 'hello' } ], - timestamp: 100000, - }; - - const connection = { transcript: stub().returns( Promise.resolve( response ) ) }; - const dispatch = stub(); - const getState = stub().returns( state ); - - return requestTranscript( connection, { getState, dispatch } ).then( () => { - expect( connection.transcript ).to.have.been.called; - - expect( dispatch ).to.have.been.calledWith( { - type: HAPPYCHAT_TRANSCRIPT_RECEIVE, - ...response, - } ); - } ); + describe( 'connection.request actions are connected', () => { + test( 'HAPPYCHAT_IO_REQUEST_TRANSCRIPT', () => { + const action = requestTranscript( 20, 30 ); + actionMiddleware( action ); + expect( connection.request ).toHaveBeenCalledWith( action, action.timeout ); } ); } ); - describe( 'HELP_CONTACT_FORM_SITE_SELECT action', () => { - test( 'should send the locale and groups through the connection and send a preferences signal', () => { - const state = { - happychat: { - connection: { status: HAPPYCHAT_CONNECTION_STATUS_CONNECTED }, - }, - currentUser: { - locale: 'en', - capabilities: {}, - }, - sites: { - items: { - 1: { ID: 1 }, - }, - }, - ui: { - section: { - name: 'reader', - }, - }, - }; - const getState = () => state; - const connection = { - setPreferences: stub(), - }; - updateChatPreferences( connection, { getState }, 1 ); - expect( connection.setPreferences ).to.have.been.called; - } ); - - test( 'should not send the locale and groups if there is no happychat connection', () => { - const state = { - currentUser: { - locale: 'en', - capabilities: {}, - }, - sites: { - items: { - 1: { ID: 1 }, - }, - }, - }; - const getState = () => state; - const connection = { - setPreferences: stub(), - }; - updateChatPreferences( connection, { getState }, 1 ); - expect( connection.setPreferences ).to.have.not.been.called; - } ); - } ); - - describe( 'ROUTE_SET action', () => { - let connection; - const action = { path: '/me' }; + describe( 'eventMessage', () => { const state = { - currentUser: { - id: '2', - }, - users: { - items: { - 2: { username: 'Link' }, - }, - }, happychat: { connection: { status: HAPPYCHAT_CONNECTION_STATUS_CONNECTED, - isAvailable: true, - }, - chat: { status: HAPPYCHAT_CHAT_STATUS_ASSIGNED }, - }, - }; - - beforeEach( () => { - connection = { sendEvent: stub() }; - } ); - - test( 'should sent the page URL the user is in', () => { - const getState = () => state; - sendRouteSetEventMessage( connection, { getState }, action ); - expect( connection.sendEvent ).to.have.been.calledWith( - 'Looking at https://wordpress.com/me?support_user=Link' - ); - } ); - - test( 'should not sent the page URL the user is in when client not connected', () => { - const getState = () => - Object.assign( {}, state, { - happychat: { connection: { status: HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED } }, - } ); - sendRouteSetEventMessage( connection, { getState }, action ); - expect( connection.sendEvent ).to.not.have.been.called; - } ); - - test( 'should not sent the page URL the user is in when chat is not assigned', () => { - const getState = () => - Object.assign( {}, state, { - happychat: { chat: { status: HAPPYCHAT_CHAT_STATUS_PENDING } }, - } ); - sendRouteSetEventMessage( connection, { getState }, action ); - expect( connection.sendEvent ).to.not.have.been.called; - } ); - } ); - - describe( '#sendAnalyticsLogEvent', () => { - let connection; - - useSandbox( sandbox => { - connection = { - sendLog: sandbox.stub(), - sendEvent: sandbox.stub(), - }; - } ); - - test( 'should ignore non-tracks analytics recordings', () => { - const analyticsMeta = [ - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'ga' } }, - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'fb' } }, - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'adwords' } }, - ]; - sendAnalyticsLogEvent( connection, { meta: { analytics: analyticsMeta } } ); - - expect( connection.sendLog ).not.to.have.been.called; - expect( connection.sendEvent ).not.to.have.been.called; - } ); - - test( 'should send log events for all listed tracks events', () => { - const analyticsMeta = [ - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'ga' } }, - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'abc' } }, - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'adwords' } }, - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'def' } }, - ]; - sendAnalyticsLogEvent( connection, { meta: { analytics: analyticsMeta } } ); - - expect( connection.sendLog.callCount ).to.equal( 2 ); - expect( connection.sendLog ).to.have.been.calledWith( 'abc' ); - expect( connection.sendLog ).to.have.been.calledWith( 'def' ); - } ); - - test( 'should only send a timeline event for whitelisted tracks events', () => { - const analyticsMeta = [ - { - type: ANALYTICS_EVENT_RECORD, - payload: { service: 'tracks', name: 'calypso_add_new_wordpress_click' }, }, - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'abc' } }, - { - type: ANALYTICS_EVENT_RECORD, - payload: { - service: 'tracks', - name: 'calypso_themeshowcase_theme_activate', - properties: {}, - }, + chat: { + status: HAPPYCHAT_CHAT_STATUS_ASSIGNED, }, - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'def' } }, - ]; - sendAnalyticsLogEvent( connection, { meta: { analytics: analyticsMeta } } ); - - expect( connection.sendEvent.callCount ).to.equal( 2 ); - } ); - } ); - - describe( '#sendActionLogsAndEvents', () => { - const assignedState = deepFreeze( { - happychat: { - connection: { status: HAPPYCHAT_CONNECTION_STATUS_CONNECTED }, - chat: { status: HAPPYCHAT_CHAT_STATUS_ASSIGNED }, - }, - } ); - const unassignedState = deepFreeze( { - happychat: { - connection: { status: HAPPYCHAT_CONNECTION_STATUS_CONNECTED }, - chat: { status: HAPPYCHAT_CHAT_STATUS_DEFAULT }, - }, - } ); - const unconnectedState = deepFreeze( { - happychat: { - connection: { status: HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED }, - chat: { status: HAPPYCHAT_CHAT_STATUS_DEFAULT }, }, - } ); + }; - let connection, getState; + describe( 'is dispatched if client is connected, chat is assigned, and there is a message for the action', () => { + test( 'for HAPPYCHAT_BLUR', () => { + store.getState.mockReturnValue( state ); + const action = blur(); + actionMiddleware( action ); - useSandbox( sandbox => { - connection = { - sendLog: sandbox.stub(), - sendEvent: sandbox.stub(), - }; + expect( store.dispatch.mock.calls[ 0 ][ 0 ].event ).toBe( 'message' ); + expect( store.dispatch.mock.calls[ 0 ][ 0 ].payload.text ).toBe( + 'Stopped looking at Happychat' + ); + } ); - getState = sandbox.stub(); - } ); + test( 'for HAPPYCHAT_FOCUS', () => { + store.getState.mockReturnValue( state ); + const action = focus(); + actionMiddleware( action ); - beforeEach( () => { - getState.returns( assignedState ); + expect( store.dispatch.mock.calls[ 0 ][ 0 ].event ).toBe( 'message' ); + expect( store.dispatch.mock.calls[ 0 ][ 0 ].payload.text ).toBe( + 'Started looking at Happychat' + ); + } ); } ); - test( "should not send events if there's no Happychat connection", () => { - const action = { - type: HAPPYCHAT_BLUR, - meta: { - analytics: [ - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'abc' } }, - ], - }, - }; - getState.returns( unconnectedState ); - sendActionLogsAndEvents( connection, { getState }, action ); - - expect( connection.sendLog ).not.to.have.been.called; - expect( connection.sendEvent ).not.to.have.been.called; + test( 'is not dispatched if client is not connected', () => { + [ + HAPPYCHAT_CONNECTION_STATUS_CONNECTING, + HAPPYCHAT_CONNECTION_STATUS_DISCONNECTED, + HAPPYCHAT_CONNECTION_STATUS_RECONNECTING, + HAPPYCHAT_CONNECTION_STATUS_UNAUTHORIZED, + HAPPYCHAT_CONNECTION_STATUS_UNINITIALIZED, + ].forEach( connectionStatus => { + store.getState.mockReturnValue( + Object.assign( state, { happychat: { connection: { status: connectionStatus } } } ) + ); + const action = blur(); + actionMiddleware( action ); + + expect( store.dispatch ).not.toHaveBeenCalled(); + } ); } ); - test( 'should not send log events if the Happychat connection is unassigned', () => { - const action = { - type: HAPPYCHAT_BLUR, - meta: { - analytics: [ - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'abc' } }, - ], - }, - }; - getState.returns( unassignedState ); - sendActionLogsAndEvents( connection, { getState }, action ); - - expect( connection.sendLog ).not.to.have.been.called; - expect( connection.sendEvent ).not.to.have.been.called; + test( 'is not dispatched if chat is not assigned', () => { + [ + HAPPYCHAT_CHAT_STATUS_ABANDONED, + HAPPYCHAT_CHAT_STATUS_ASSIGNING, + HAPPYCHAT_CHAT_STATUS_BLOCKED, + HAPPYCHAT_CHAT_STATUS_CLOSED, + HAPPYCHAT_CHAT_STATUS_DEFAULT, + HAPPYCHAT_CHAT_STATUS_NEW, + HAPPYCHAT_CHAT_STATUS_MISSED, + HAPPYCHAT_CHAT_STATUS_PENDING, + ].forEach( chatStatus => { + store.getState.mockReturnValue( + Object.assign( state, { happychat: { chat: { status: chatStatus } } } ) + ); + const action = blur(); + actionMiddleware( action ); + + expect( store.dispatch ).not.toHaveBeenCalled(); + } ); } ); - test( 'should send matching events when Happychat is connected and assigned', () => { - const action = { - type: HAPPYCHAT_BLUR, - meta: { - analytics: [ - { - type: ANALYTICS_EVENT_RECORD, - payload: { service: 'tracks', name: 'calypso_add_new_wordpress_click' }, - }, - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'abc' } }, - { - type: ANALYTICS_EVENT_RECORD, - payload: { - service: 'tracks', - name: 'calypso_themeshowcase_theme_activate', - properties: {}, - }, - }, - { type: ANALYTICS_EVENT_RECORD, payload: { service: 'tracks', name: 'def' } }, - ], - }, - }; - getState.returns( assignedState ); - sendActionLogsAndEvents( connection, { getState }, action ); - - // All 4 analytics records will be sent to the "firehose" log - expect( connection.sendLog.callCount ).to.equal( 4 ); - // The two whitelisted analytics events and the HAPPYCHAT_BLUR action itself - // will be sent as customer events - expect( connection.sendEvent.callCount ).to.equal( 3 ); + test( 'is not dispatched if there is no message defined', () => { + store.getState.mockReturnValue( state ); + const action = { type: 'HAPPYCHAT_ACTION_WITHOUT_EVENT_MESSAGE_DEFINED' }; + actionMiddleware( action ); + expect( store.dispatch ).not.toHaveBeenCalled(); } ); } ); } ); diff --git a/client/state/happychat/test/utils.js b/client/state/happychat/test/utils.js new file mode 100644 index 0000000000000..d69633b5509f9 --- /dev/null +++ b/client/state/happychat/test/utils.js @@ -0,0 +1,81 @@ +/** @format */ + +/** + * Internal dependencies + */ +import { getHappychatAuth } from '../utils'; +import config from 'config'; +import * as wpcom from 'lib/wp'; +import * as selectedSite from 'state/help/selectors'; + +describe( 'auth promise', () => { + const state = { + currentUser: { + id: 3, + }, + users: { + items: { + 3: { ID: 123456, localeSlug: 'gl' }, + }, + }, + ui: { + section: { + name: 'jetpackConnect', + }, + }, + }; + + describe( 'upon request success', () => { + beforeEach( () => { + wpcom.default.request = jest.fn(); + wpcom.default.request.mockImplementation( ( args, callback ) => + callback( null, { + jwt: 'jwt', + geo_location: { + city: 'Lugo', + }, + } ) + ); + + // mock getHelpSelectedSite to return null + selectedSite.getHelpSelectedSite = jest.fn(); + selectedSite.getHelpSelectedSite.mockReturnValue( null ); + } ); + + test( 'should return a fulfilled Promise', () => { + getHappychatAuth( state )().then( user => { + expect( user ).toMatchObject( { + url: config( 'happychat_url' ), + user: { + signer_user_id: state.users.items[ 3 ].ID, + locale: state.users.items[ 3 ].localeSlug, + groups: [ 'jpop' ], + jwt: 'jwt', + geoLocation: { city: 'Lugo' }, + }, + } ); + } ); + } ); + } ); + + describe( 'upon request failure', () => { + beforeEach( () => { + wpcom.default.request = jest.fn(); + wpcom.default.request.mockImplementation( ( args, callback ) => + callback( 'failed request', {} ) + ); + + // mock getHelpSelectedSite to return null + selectedSite.getHelpSelectedSite = jest.fn(); + selectedSite.getHelpSelectedSite.mockReturnValue( null ); + } ); + + test( 'should return a rejected Promise', () => { + getHappychatAuth( state )().catch( error => { + expect( error ).toBe( + 'Failed to start an authenticated Happychat session: failed request' + ); + } ); + } ); + } ); +} ); diff --git a/client/state/happychat/ui/reducer.js b/client/state/happychat/ui/reducer.js index 1c92346750dde..d93f46b75c291 100644 --- a/client/state/happychat/ui/reducer.js +++ b/client/state/happychat/ui/reducer.js @@ -10,8 +10,8 @@ import { HAPPYCHAT_MINIMIZING, HAPPYCHAT_BLUR, HAPPYCHAT_FOCUS, + HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE, HAPPYCHAT_SET_CURRENT_MESSAGE, - HAPPYCHAT_SEND_MESSAGE, } from 'state/action-types'; import { combineReducers, isValidStateWithSchema } from 'state/utils'; @@ -25,7 +25,7 @@ import { combineReducers, isValidStateWithSchema } from 'state/utils'; */ export const currentMessage = ( state = '', action ) => { switch ( action.type ) { - case HAPPYCHAT_SEND_MESSAGE: + case HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE: return ''; case HAPPYCHAT_SET_CURRENT_MESSAGE: return action.message; diff --git a/client/state/happychat/ui/test/index.js b/client/state/happychat/ui/test/index.js index dc759bbdf95b2..d7df5b6738a9f 100644 --- a/client/state/happychat/ui/test/index.js +++ b/client/state/happychat/ui/test/index.js @@ -12,7 +12,7 @@ import { SERIALIZE, HAPPYCHAT_BLUR, HAPPYCHAT_FOCUS, - HAPPYCHAT_SEND_MESSAGE, + HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE, HAPPYCHAT_SET_CURRENT_MESSAGE, } from 'state/action-types'; import { lostFocusAt, currentMessage } from '../reducer'; @@ -54,8 +54,8 @@ describe( 'reducers', () => { expect( result ).to.eql( 'abcd' ); } ); - test( 'resets to empty string on HAPPYCHAT_SEND_MESSAGE', () => { - const action = { type: HAPPYCHAT_SEND_MESSAGE, message: 'abcd' }; + test( 'resets to empty string on HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE', () => { + const action = { type: HAPPYCHAT_IO_SEND_MESSAGE_MESSAGE, payload: { message: 'abcd' } }; const result = currentMessage( 'abcd', action ); expect( result ).to.eql( '' ); } ); diff --git a/client/state/happychat/user/reducer.js b/client/state/happychat/user/reducer.js index 74f184a1e5ee6..d15705762039d 100644 --- a/client/state/happychat/user/reducer.js +++ b/client/state/happychat/user/reducer.js @@ -1,8 +1,9 @@ /** @format */ + /** * Internal dependencies */ -import { HAPPYCHAT_CONNECTED } from 'state/action-types'; +import { HAPPYCHAT_IO_RECEIVE_INIT } from 'state/action-types'; import { combineReducers, createReducer } from 'state/utils'; import { geoLocationSchema } from './schema'; @@ -17,7 +18,7 @@ import { geoLocationSchema } from './schema'; export const geoLocation = createReducer( null, { - [ HAPPYCHAT_CONNECTED ]: ( state, action ) => { + [ HAPPYCHAT_IO_RECEIVE_INIT ]: ( state, action ) => { const { user: { geoLocation: location } } = action; if ( location && location.country_long && location.city ) { return location; diff --git a/client/state/happychat/user/test/reducer.js b/client/state/happychat/user/test/reducer.js index 7bfcba19d9af6..14a6a1da3b6bc 100644 --- a/client/state/happychat/user/test/reducer.js +++ b/client/state/happychat/user/test/reducer.js @@ -8,7 +8,7 @@ import { expect } from 'chai'; /** * Internal dependencies */ -import { HAPPYCHAT_CONNECTED, DESERIALIZE } from 'state/action-types'; +import { HAPPYCHAT_IO_RECEIVE_INIT, DESERIALIZE } from 'state/action-types'; import { geoLocation } from '../reducer'; describe( '#geoLocation()', () => { @@ -20,7 +20,7 @@ describe( '#geoLocation()', () => { test( 'should set the current user geolocation', () => { const state = geoLocation( null, { - type: HAPPYCHAT_CONNECTED, + type: HAPPYCHAT_IO_RECEIVE_INIT, user: { geoLocation: { country_long: 'Romania', diff --git a/client/state/happychat/utils.js b/client/state/happychat/utils.js new file mode 100644 index 0000000000000..6d965e9e953ed --- /dev/null +++ b/client/state/happychat/utils.js @@ -0,0 +1,62 @@ +/** @format */ + +/** + * Internal dependencies + */ +import wpcom from 'lib/wp'; +import config from 'config'; +import { getGroups } from 'state/happychat/selectors'; +import { getCurrentUser, getCurrentUserLocale } from 'state/current-user/selectors'; +import { getHelpSelectedSite } from 'state/help/selectors'; + +// Promise based interface for wpcom.request +const request = ( ...args ) => + new Promise( ( resolve, reject ) => { + wpcom.request( ...args, ( error, response ) => { + if ( error ) { + return reject( error ); + } + resolve( response ); + } ); + } ); + +const sign = payload => + request( { + method: 'POST', + path: '/jwt/sign', + body: { payload: JSON.stringify( payload ) }, + } ); + +const startSession = () => + request( { + method: 'POST', + path: '/happychat/session', + } ); + +export const getHappychatAuth = state => () => { + const url = config( 'happychat_url' ); + + const locale = getCurrentUserLocale( state ); + + let groups = getGroups( state ); + const selectedSite = getHelpSelectedSite( state ); + if ( selectedSite && selectedSite.ID ) { + groups = getGroups( state, selectedSite.ID ); + } + + const user = getCurrentUser( state ); + + const happychatUser = { + signer_user_id: user.ID, + locale, + groups, + }; + + return startSession() + .then( ( { session_id, geo_location } ) => { + happychatUser.geoLocation = geo_location; + return sign( { user, session_id } ); + } ) + .then( ( { jwt } ) => ( { url, user: { jwt, ...happychatUser } } ) ) + .catch( e => Promise.reject( 'Failed to start an authenticated Happychat session: ' + e ) ); +}; diff --git a/client/state/index.js b/client/state/index.js index 3a2ca36929112..2eddd7e5a483f 100644 --- a/client/state/index.js +++ b/client/state/index.js @@ -176,7 +176,8 @@ export function createReduxStore( initialState = {} ) { require( './data-layer/wpcom-api-middleware.js' ).default, isBrowser && require( './data-layer/extensions-middleware.js' ).default, noticesMiddleware, - isBrowser && require( './happychat/middleware.js' ).default(), + isBrowser && require( './happychat/middleware.js' ).default, + isBrowser && require( './happychat/middleware-calypso.js' ).default, isBrowser && require( './analytics/middleware.js' ).analyticsMiddleware, isBrowser && require( './lib/middleware.js' ).default, isBrowser && diff --git a/client/state/jetpack-connect/reducer.js b/client/state/jetpack-connect/reducer.js deleted file mode 100644 index 353f952838dcd..0000000000000 --- a/client/state/jetpack-connect/reducer.js +++ /dev/null @@ -1,303 +0,0 @@ -/** - * External dependencis - * - * @format - */ - -import { isEmpty, omit, pickBy } from 'lodash'; -/** - * Internal dependencies - */ -import { - JETPACK_CONNECT_CHECK_URL, - JETPACK_CONNECT_CHECK_URL_RECEIVE, - JETPACK_CONNECT_DISMISS_URL_STATUS, - JETPACK_CONNECT_CONFIRM_JETPACK_STATUS, - JETPACK_CONNECT_COMPLETE_FLOW, - JETPACK_CONNECT_QUERY_SET, - JETPACK_CONNECT_AUTHORIZE, - JETPACK_CONNECT_AUTHORIZE_LOGIN_COMPLETE, - JETPACK_CONNECT_AUTHORIZE_RECEIVE, - JETPACK_CONNECT_AUTHORIZE_RECEIVE_SITE_LIST, - JETPACK_CONNECT_CREATE_ACCOUNT, - JETPACK_CONNECT_CREATE_ACCOUNT_RECEIVE, - JETPACK_CONNECT_REDIRECT, - JETPACK_CONNECT_REDIRECT_WP_ADMIN, - JETPACK_CONNECT_REDIRECT_XMLRPC_ERROR_FALLBACK_URL, - JETPACK_CONNECT_RETRY_AUTH, - JETPACK_CONNECT_SELECT_PLAN_IN_ADVANCE, - JETPACK_CONNECT_SSO_AUTHORIZE_REQUEST, - JETPACK_CONNECT_SSO_AUTHORIZE_SUCCESS, - JETPACK_CONNECT_SSO_AUTHORIZE_ERROR, - JETPACK_CONNECT_SSO_VALIDATION_REQUEST, - JETPACK_CONNECT_SSO_VALIDATION_SUCCESS, - JETPACK_CONNECT_SSO_VALIDATION_ERROR, - JETPACK_CONNECT_USER_ALREADY_CONNECTED, - SITE_REQUEST_FAILURE, - SERIALIZE, - DESERIALIZE, -} from 'state/action-types'; -import { combineReducers, isValidStateWithSchema } from 'state/utils'; -import { - jetpackConnectSessionsSchema, - jetpackAuthAttemptsSchema, - jetpackConnectSelectedPlansSchema, -} from './schema'; -import { isStale } from './utils'; -import { JETPACK_CONNECT_AUTHORIZE_TTL, AUTH_ATTEMPS_TTL } from './constants'; -import { urlToSlug } from 'lib/url'; - -function buildDefaultAuthorizeState() { - return { - queryObject: {}, - isAuthorizing: false, - authorizeSuccess: false, - authorizeError: false, - timestamp: Date.now(), - userAlreadyConnected: false, - }; -} - -function buildUrlSessionObj( url, flowType ) { - const slug = urlToSlug( url ); - const sessionValue = { - timestamp: Date.now(), - flowType: flowType || '', - }; - return { [ slug ]: sessionValue }; -} - -export function jetpackConnectSessions( state = {}, action ) { - switch ( action.type ) { - case JETPACK_CONNECT_CHECK_URL: - return Object.assign( {}, state, buildUrlSessionObj( action.url, action.flowType ) ); - case DESERIALIZE: - if ( isValidStateWithSchema( state, jetpackConnectSessionsSchema ) ) { - return pickBy( state, session => { - return ! isStale( session.timestamp ); - } ); - } - return {}; - case SERIALIZE: - return state; - } - return state; -} -jetpackConnectSessions.hasCustomPersistence = true; - -export function jetpackConnectSite( state = {}, action ) { - const defaultState = { - url: null, - isFetching: false, - isFetched: false, - isDismissed: false, - installConfirmedByUser: null, - data: {}, - }; - switch ( action.type ) { - case JETPACK_CONNECT_CHECK_URL: - return Object.assign( {}, defaultState, { - url: action.url, - isFetching: true, - isFetched: false, - isDismissed: false, - installConfirmedByUser: null, - data: {}, - } ); - case JETPACK_CONNECT_CHECK_URL_RECEIVE: - if ( action.url === state.url ) { - return Object.assign( {}, state, { - isFetching: false, - isFetched: true, - data: action.data, - } ); - } - return state; - case JETPACK_CONNECT_DISMISS_URL_STATUS: - if ( action.url === state.url ) { - return Object.assign( {}, state, { installConfirmedByUser: null, isDismissed: true } ); - } - return state; - case JETPACK_CONNECT_REDIRECT: - if ( action.url === state.url ) { - return Object.assign( {}, state, { isRedirecting: true } ); - } - return state; - case JETPACK_CONNECT_CONFIRM_JETPACK_STATUS: - return Object.assign( {}, state, { installConfirmedByUser: action.status } ); - case JETPACK_CONNECT_COMPLETE_FLOW: - return {}; - } - return state; -} - -export function jetpackConnectAuthorize( state = {}, action ) { - switch ( action.type ) { - case JETPACK_CONNECT_AUTHORIZE: - return Object.assign( {}, omit( state, 'userData', 'bearerToken' ), { - isAuthorizing: true, - authorizeSuccess: false, - authorizeError: false, - isRedirectingToWpAdmin: false, - autoAuthorize: false, - } ); - case JETPACK_CONNECT_AUTHORIZE_RECEIVE: - if ( isEmpty( action.error ) && action.data ) { - const { plans_url } = action.data; - return Object.assign( {}, state, { - authorizeError: false, - authorizeSuccess: true, - autoAuthorize: false, - plansUrl: plans_url, - siteReceived: false, - } ); - } - return Object.assign( {}, state, { - isAuthorizing: false, - authorizeError: action.error, - authorizeSuccess: false, - autoAuthorize: false, - } ); - case JETPACK_CONNECT_AUTHORIZE_LOGIN_COMPLETE: - return Object.assign( {}, state, { authorizationCode: action.data.code } ); - case JETPACK_CONNECT_AUTHORIZE_RECEIVE_SITE_LIST: - const updateQueryObject = omit( state.queryObject, '_wp_nonce', 'secret', 'scope' ); - return Object.assign( {}, omit( state, 'queryObject' ), { - siteReceived: true, - isAuthorizing: false, - queryObject: updateQueryObject, - } ); - case JETPACK_CONNECT_QUERY_SET: - const queryObject = Object.assign( {}, action.queryObject ); - return Object.assign( {}, buildDefaultAuthorizeState(), { queryObject: queryObject } ); - case JETPACK_CONNECT_CREATE_ACCOUNT: - return Object.assign( {}, state, { - isAuthorizing: true, - authorizeSuccess: false, - authorizeError: false, - autoAuthorize: true, - } ); - case JETPACK_CONNECT_CREATE_ACCOUNT_RECEIVE: - if ( ! isEmpty( action.error ) ) { - return Object.assign( {}, state, { - isAuthorizing: false, - authorizeSuccess: false, - authorizeError: true, - autoAuthorize: false, - } ); - } - return Object.assign( {}, state, { - isAuthorizing: true, - authorizeSuccess: false, - authorizeError: false, - autoAuthorize: true, - userData: action.userData, - bearerToken: action.data.bearer_token, - } ); - case SITE_REQUEST_FAILURE: - if ( - state.queryObject && - state.queryObject.client_id && - parseInt( state.queryObject.client_id ) === action.siteId - ) { - return Object.assign( {}, state, { clientNotResponding: true } ); - } - return state; - case JETPACK_CONNECT_USER_ALREADY_CONNECTED: - return Object.assign( {}, state, { userAlreadyConnected: true } ); - case JETPACK_CONNECT_REDIRECT_XMLRPC_ERROR_FALLBACK_URL: - return Object.assign( {}, state, { isRedirectingToWpAdmin: true } ); - case JETPACK_CONNECT_REDIRECT_WP_ADMIN: - return Object.assign( {}, state, { isRedirectingToWpAdmin: true } ); - case JETPACK_CONNECT_COMPLETE_FLOW: - return {}; - case DESERIALIZE: - return ! isStale( state.timestamp, JETPACK_CONNECT_AUTHORIZE_TTL ) ? state : {}; - case SERIALIZE: - return state; - } - return state; -} -jetpackConnectAuthorize.hasCustomPersistence = true; - -export function jetpackAuthAttempts( state = {}, action ) { - switch ( action.type ) { - case JETPACK_CONNECT_RETRY_AUTH: - const slug = action.slug; - let currentTimestamp = state[ slug ] ? state[ slug ].timestamp || Date.now() : Date.now(); - let attemptNumber = action.attemptNumber; - if ( attemptNumber > 0 ) { - const now = Date.now(); - if ( isStale( currentTimestamp, AUTH_ATTEMPS_TTL ) ) { - currentTimestamp = now; - attemptNumber = 0; - } - } - return Object.assign( {}, state, { - [ slug ]: { attempt: attemptNumber, timestamp: currentTimestamp }, - } ); - case JETPACK_CONNECT_COMPLETE_FLOW: - return {}; - } - return state; -} -jetpackAuthAttempts.schema = jetpackAuthAttemptsSchema; - -export function jetpackSSO( state = {}, action ) { - switch ( action.type ) { - case JETPACK_CONNECT_SSO_VALIDATION_REQUEST: - return Object.assign( {}, state, { isValidating: true } ); - case JETPACK_CONNECT_SSO_VALIDATION_SUCCESS: - return Object.assign( {}, state, { - isValidating: false, - validationError: false, - nonceValid: action.success, - blogDetails: action.blogDetails, - sharedDetails: action.sharedDetails, - } ); - case JETPACK_CONNECT_SSO_VALIDATION_ERROR: - return Object.assign( {}, state, { - isValidating: false, - validationError: action.error, - nonceValid: false, - } ); - case JETPACK_CONNECT_SSO_AUTHORIZE_REQUEST: - return Object.assign( {}, state, { isAuthorizing: true } ); - case JETPACK_CONNECT_SSO_AUTHORIZE_SUCCESS: - return Object.assign( {}, state, { - isAuthorizing: false, - authorizationError: false, - ssoUrl: action.ssoUrl, - } ); - case JETPACK_CONNECT_SSO_AUTHORIZE_ERROR: - return Object.assign( {}, state, { - isAuthorizing: false, - authorizationError: action.error, - ssoUrl: false, - } ); - } - return state; -} - -export function jetpackConnectSelectedPlans( state = {}, action ) { - switch ( action.type ) { - case JETPACK_CONNECT_SELECT_PLAN_IN_ADVANCE: - const siteSlug = urlToSlug( action.site ); - return Object.assign( {}, state, { [ siteSlug ]: action.plan } ); - case JETPACK_CONNECT_CHECK_URL: - return { '*': state[ '*' ] }; - case JETPACK_CONNECT_COMPLETE_FLOW: - return {}; - } - return state; -} -jetpackConnectSelectedPlans.schema = jetpackConnectSelectedPlansSchema; - -export default combineReducers( { - jetpackConnectSite, - jetpackSSO, - jetpackConnectAuthorize, - jetpackConnectSessions, - jetpackConnectSelectedPlans, - jetpackAuthAttempts, -} ); diff --git a/client/state/jetpack-connect/reducer/index.js b/client/state/jetpack-connect/reducer/index.js new file mode 100644 index 0000000000000..979a08b5a2151 --- /dev/null +++ b/client/state/jetpack-connect/reducer/index.js @@ -0,0 +1,20 @@ +/** @format */ +/** + * Internal dependencies + */ +import jetpackAuthAttempts from './jetpack-auth-attempts'; +import jetpackConnectAuthorize from './jetpack-connect-authorize'; +import jetpackConnectSelectedPlans from './jetpack-connect-selected-plans'; +import jetpackConnectSessions from './jetpack-connect-sessions'; +import jetpackConnectSite from './jetpack-connect-site'; +import jetpackSSO from './jetpack-sso'; +import { combineReducers } from 'state/utils'; + +export default combineReducers( { + jetpackConnectSite, + jetpackSSO, + jetpackConnectAuthorize, + jetpackConnectSessions, + jetpackConnectSelectedPlans, + jetpackAuthAttempts, +} ); diff --git a/client/state/jetpack-connect/reducer/jetpack-auth-attempts.js b/client/state/jetpack-connect/reducer/jetpack-auth-attempts.js new file mode 100644 index 0000000000000..226fbe0a0b24f --- /dev/null +++ b/client/state/jetpack-connect/reducer/jetpack-auth-attempts.js @@ -0,0 +1,31 @@ +/** @format */ +/** + * Internal dependencies + */ +import { AUTH_ATTEMPS_TTL } from '../constants'; +import { isStale } from '../utils'; +import { JETPACK_CONNECT_COMPLETE_FLOW, JETPACK_CONNECT_RETRY_AUTH } from 'state/action-types'; +import { jetpackAuthAttemptsSchema } from './schema'; + +export default function jetpackAuthAttempts( state = {}, action ) { + switch ( action.type ) { + case JETPACK_CONNECT_RETRY_AUTH: + const slug = action.slug; + let currentTimestamp = state[ slug ] ? state[ slug ].timestamp || Date.now() : Date.now(); + let attemptNumber = action.attemptNumber; + if ( attemptNumber > 0 ) { + const now = Date.now(); + if ( isStale( currentTimestamp, AUTH_ATTEMPS_TTL ) ) { + currentTimestamp = now; + attemptNumber = 0; + } + } + return Object.assign( {}, state, { + [ slug ]: { attempt: attemptNumber, timestamp: currentTimestamp }, + } ); + case JETPACK_CONNECT_COMPLETE_FLOW: + return {}; + } + return state; +} +jetpackAuthAttempts.schema = jetpackAuthAttemptsSchema; diff --git a/client/state/jetpack-connect/reducer/jetpack-connect-authorize.js b/client/state/jetpack-connect/reducer/jetpack-connect-authorize.js new file mode 100644 index 0000000000000..f6fcfc7aca53a --- /dev/null +++ b/client/state/jetpack-connect/reducer/jetpack-connect-authorize.js @@ -0,0 +1,127 @@ +/** @format */ +/** + * External dependencis + */ +import { isEmpty, omit } from 'lodash'; + +/** + * Internal dependencies + */ +import { + JETPACK_CONNECT_COMPLETE_FLOW, + JETPACK_CONNECT_QUERY_SET, + JETPACK_CONNECT_AUTHORIZE, + JETPACK_CONNECT_AUTHORIZE_LOGIN_COMPLETE, + JETPACK_CONNECT_AUTHORIZE_RECEIVE, + JETPACK_CONNECT_AUTHORIZE_RECEIVE_SITE_LIST, + JETPACK_CONNECT_CREATE_ACCOUNT, + JETPACK_CONNECT_CREATE_ACCOUNT_RECEIVE, + JETPACK_CONNECT_REDIRECT_WP_ADMIN, + JETPACK_CONNECT_REDIRECT_XMLRPC_ERROR_FALLBACK_URL, + JETPACK_CONNECT_USER_ALREADY_CONNECTED, + SITE_REQUEST_FAILURE, + SERIALIZE, + DESERIALIZE, +} from 'state/action-types'; +import { isStale } from '../utils'; +import { JETPACK_CONNECT_AUTHORIZE_TTL } from '../constants'; + +function buildDefaultAuthorizeState() { + return { + queryObject: {}, + isAuthorizing: false, + authorizeSuccess: false, + authorizeError: false, + timestamp: Date.now(), + userAlreadyConnected: false, + }; +} + +export default function jetpackConnectAuthorize( state = {}, action ) { + switch ( action.type ) { + case JETPACK_CONNECT_AUTHORIZE: + return Object.assign( {}, omit( state, 'userData', 'bearerToken' ), { + isAuthorizing: true, + authorizeSuccess: false, + authorizeError: false, + isRedirectingToWpAdmin: false, + autoAuthorize: false, + } ); + case JETPACK_CONNECT_AUTHORIZE_RECEIVE: + if ( isEmpty( action.error ) && action.data ) { + const { plans_url } = action.data; + return Object.assign( {}, state, { + authorizeError: false, + authorizeSuccess: true, + autoAuthorize: false, + plansUrl: plans_url, + siteReceived: false, + } ); + } + return Object.assign( {}, state, { + isAuthorizing: false, + authorizeError: action.error, + authorizeSuccess: false, + autoAuthorize: false, + } ); + case JETPACK_CONNECT_AUTHORIZE_LOGIN_COMPLETE: + return Object.assign( {}, state, { authorizationCode: action.data.code } ); + case JETPACK_CONNECT_AUTHORIZE_RECEIVE_SITE_LIST: + const updateQueryObject = omit( state.queryObject, '_wp_nonce', 'secret', 'scope' ); + return Object.assign( {}, omit( state, 'queryObject' ), { + siteReceived: true, + isAuthorizing: false, + queryObject: updateQueryObject, + } ); + case JETPACK_CONNECT_QUERY_SET: + const queryObject = Object.assign( {}, action.queryObject ); + return Object.assign( {}, buildDefaultAuthorizeState(), { queryObject: queryObject } ); + case JETPACK_CONNECT_CREATE_ACCOUNT: + return Object.assign( {}, state, { + isAuthorizing: true, + authorizeSuccess: false, + authorizeError: false, + autoAuthorize: true, + } ); + case JETPACK_CONNECT_CREATE_ACCOUNT_RECEIVE: + if ( ! isEmpty( action.error ) ) { + return Object.assign( {}, state, { + isAuthorizing: false, + authorizeSuccess: false, + authorizeError: true, + autoAuthorize: false, + } ); + } + return Object.assign( {}, state, { + isAuthorizing: true, + authorizeSuccess: false, + authorizeError: false, + autoAuthorize: true, + userData: action.userData, + bearerToken: action.data.bearer_token, + } ); + case SITE_REQUEST_FAILURE: + if ( + state.queryObject && + state.queryObject.client_id && + parseInt( state.queryObject.client_id ) === action.siteId + ) { + return Object.assign( {}, state, { clientNotResponding: true } ); + } + return state; + case JETPACK_CONNECT_USER_ALREADY_CONNECTED: + return Object.assign( {}, state, { userAlreadyConnected: true } ); + case JETPACK_CONNECT_REDIRECT_XMLRPC_ERROR_FALLBACK_URL: + return Object.assign( {}, state, { isRedirectingToWpAdmin: true } ); + case JETPACK_CONNECT_REDIRECT_WP_ADMIN: + return Object.assign( {}, state, { isRedirectingToWpAdmin: true } ); + case JETPACK_CONNECT_COMPLETE_FLOW: + return {}; + case DESERIALIZE: + return ! isStale( state.timestamp, JETPACK_CONNECT_AUTHORIZE_TTL ) ? state : {}; + case SERIALIZE: + return state; + } + return state; +} +jetpackConnectAuthorize.hasCustomPersistence = true; diff --git a/client/state/jetpack-connect/reducer/jetpack-connect-selected-plans.js b/client/state/jetpack-connect/reducer/jetpack-connect-selected-plans.js new file mode 100644 index 0000000000000..bdae541171ff8 --- /dev/null +++ b/client/state/jetpack-connect/reducer/jetpack-connect-selected-plans.js @@ -0,0 +1,25 @@ +/** @format */ +/** + * Internal dependencies + */ +import { + JETPACK_CONNECT_CHECK_URL, + JETPACK_CONNECT_COMPLETE_FLOW, + JETPACK_CONNECT_SELECT_PLAN_IN_ADVANCE, +} from 'state/action-types'; +import { jetpackConnectSelectedPlansSchema } from './schema'; +import { urlToSlug } from 'lib/url'; + +export default function jetpackConnectSelectedPlans( state = {}, action ) { + switch ( action.type ) { + case JETPACK_CONNECT_SELECT_PLAN_IN_ADVANCE: + const siteSlug = urlToSlug( action.site ); + return Object.assign( {}, state, { [ siteSlug ]: action.plan } ); + case JETPACK_CONNECT_CHECK_URL: + return { '*': state[ '*' ] }; + case JETPACK_CONNECT_COMPLETE_FLOW: + return {}; + } + return state; +} +jetpackConnectSelectedPlans.schema = jetpackConnectSelectedPlansSchema; diff --git a/client/state/jetpack-connect/reducer/jetpack-connect-sessions.js b/client/state/jetpack-connect/reducer/jetpack-connect-sessions.js new file mode 100644 index 0000000000000..147060aace7b3 --- /dev/null +++ b/client/state/jetpack-connect/reducer/jetpack-connect-sessions.js @@ -0,0 +1,41 @@ +/** @format */ +/** + * External dependencis + */ +import { pickBy } from 'lodash'; + +/** + * Internal dependencies + */ +import { DESERIALIZE, JETPACK_CONNECT_CHECK_URL, SERIALIZE } from 'state/action-types'; +import { isValidStateWithSchema } from 'state/utils'; +import { jetpackConnectSessionsSchema } from './schema'; +import { isStale } from '../utils'; +import { urlToSlug } from 'lib/url'; + +function buildUrlSessionObj( url, flowType ) { + const slug = urlToSlug( url ); + const sessionValue = { + timestamp: Date.now(), + flowType: flowType || '', + }; + return { [ slug ]: sessionValue }; +} + +export default function jetpackConnectSessions( state = {}, action ) { + switch ( action.type ) { + case JETPACK_CONNECT_CHECK_URL: + return Object.assign( {}, state, buildUrlSessionObj( action.url, action.flowType ) ); + case DESERIALIZE: + if ( isValidStateWithSchema( state, jetpackConnectSessionsSchema ) ) { + return pickBy( state, session => { + return ! isStale( session.timestamp ); + } ); + } + return {}; + case SERIALIZE: + return state; + } + return state; +} +jetpackConnectSessions.hasCustomPersistence = true; diff --git a/client/state/jetpack-connect/reducer/jetpack-connect-site.js b/client/state/jetpack-connect/reducer/jetpack-connect-site.js new file mode 100644 index 0000000000000..b1664a68230e3 --- /dev/null +++ b/client/state/jetpack-connect/reducer/jetpack-connect-site.js @@ -0,0 +1,58 @@ +/** @format */ +/** + * Internal dependencies + */ +import { + JETPACK_CONNECT_CHECK_URL, + JETPACK_CONNECT_CHECK_URL_RECEIVE, + JETPACK_CONNECT_DISMISS_URL_STATUS, + JETPACK_CONNECT_CONFIRM_JETPACK_STATUS, + JETPACK_CONNECT_COMPLETE_FLOW, + JETPACK_CONNECT_REDIRECT, +} from 'state/action-types'; + +export default function jetpackConnectSite( state = {}, action ) { + const defaultState = { + url: null, + isFetching: false, + isFetched: false, + isDismissed: false, + installConfirmedByUser: null, + data: {}, + }; + switch ( action.type ) { + case JETPACK_CONNECT_CHECK_URL: + return Object.assign( {}, defaultState, { + url: action.url, + isFetching: true, + isFetched: false, + isDismissed: false, + installConfirmedByUser: null, + data: {}, + } ); + case JETPACK_CONNECT_CHECK_URL_RECEIVE: + if ( action.url === state.url ) { + return Object.assign( {}, state, { + isFetching: false, + isFetched: true, + data: action.data, + } ); + } + return state; + case JETPACK_CONNECT_DISMISS_URL_STATUS: + if ( action.url === state.url ) { + return Object.assign( {}, state, { installConfirmedByUser: null, isDismissed: true } ); + } + return state; + case JETPACK_CONNECT_REDIRECT: + if ( action.url === state.url ) { + return Object.assign( {}, state, { isRedirecting: true } ); + } + return state; + case JETPACK_CONNECT_CONFIRM_JETPACK_STATUS: + return Object.assign( {}, state, { installConfirmedByUser: action.status } ); + case JETPACK_CONNECT_COMPLETE_FLOW: + return {}; + } + return state; +} diff --git a/client/state/jetpack-connect/reducer/jetpack-sso.js b/client/state/jetpack-connect/reducer/jetpack-sso.js new file mode 100644 index 0000000000000..9837cbae3ff1d --- /dev/null +++ b/client/state/jetpack-connect/reducer/jetpack-sso.js @@ -0,0 +1,48 @@ +/** @format */ +/** + * Internal dependencies + */ +import { + JETPACK_CONNECT_SSO_AUTHORIZE_REQUEST, + JETPACK_CONNECT_SSO_AUTHORIZE_SUCCESS, + JETPACK_CONNECT_SSO_AUTHORIZE_ERROR, + JETPACK_CONNECT_SSO_VALIDATION_REQUEST, + JETPACK_CONNECT_SSO_VALIDATION_SUCCESS, + JETPACK_CONNECT_SSO_VALIDATION_ERROR, +} from 'state/action-types'; + +export default function jetpackSSO( state = {}, action ) { + switch ( action.type ) { + case JETPACK_CONNECT_SSO_VALIDATION_REQUEST: + return Object.assign( {}, state, { isValidating: true } ); + case JETPACK_CONNECT_SSO_VALIDATION_SUCCESS: + return Object.assign( {}, state, { + isValidating: false, + validationError: false, + nonceValid: action.success, + blogDetails: action.blogDetails, + sharedDetails: action.sharedDetails, + } ); + case JETPACK_CONNECT_SSO_VALIDATION_ERROR: + return Object.assign( {}, state, { + isValidating: false, + validationError: action.error, + nonceValid: false, + } ); + case JETPACK_CONNECT_SSO_AUTHORIZE_REQUEST: + return Object.assign( {}, state, { isAuthorizing: true } ); + case JETPACK_CONNECT_SSO_AUTHORIZE_SUCCESS: + return Object.assign( {}, state, { + isAuthorizing: false, + authorizationError: false, + ssoUrl: action.ssoUrl, + } ); + case JETPACK_CONNECT_SSO_AUTHORIZE_ERROR: + return Object.assign( {}, state, { + isAuthorizing: false, + authorizationError: action.error, + ssoUrl: false, + } ); + } + return state; +} diff --git a/client/state/jetpack-connect/schema.js b/client/state/jetpack-connect/reducer/schema.js similarity index 100% rename from client/state/jetpack-connect/schema.js rename to client/state/jetpack-connect/reducer/schema.js diff --git a/client/state/jetpack-connect/reducer/test/__snapshots__/index.js.snap b/client/state/jetpack-connect/reducer/test/__snapshots__/index.js.snap new file mode 100644 index 0000000000000..c0ba449f285c9 --- /dev/null +++ b/client/state/jetpack-connect/reducer/test/__snapshots__/index.js.snap @@ -0,0 +1,12 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`reducer should export expected reducer keys 1`] = ` +Object { + "jetpackAuthAttempts": Object {}, + "jetpackConnectAuthorize": Object {}, + "jetpackConnectSelectedPlans": Object {}, + "jetpackConnectSessions": Object {}, + "jetpackConnectSite": Object {}, + "jetpackSSO": Object {}, +} +`; diff --git a/client/state/jetpack-connect/reducer/test/index.js b/client/state/jetpack-connect/reducer/test/index.js new file mode 100644 index 0000000000000..c8ab8db7e385b --- /dev/null +++ b/client/state/jetpack-connect/reducer/test/index.js @@ -0,0 +1,20 @@ +/** @format */ +/** + * Internal dependencies + */ +import reducer from '..'; + +describe( 'reducer', () => { + test( 'should export expected reducer keys', () => { + const initialState = reducer( undefined, {} ); + expect( initialState ).toMatchObject( { + jetpackConnectSite: expect.anything(), + jetpackConnectAuthorize: expect.anything(), + jetpackConnectSessions: expect.anything(), + jetpackSSO: expect.anything(), + jetpackConnectSelectedPlans: expect.anything(), + jetpackAuthAttempts: expect.anything(), + } ); + expect( initialState ).toMatchSnapshot(); + } ); +} ); diff --git a/client/state/jetpack-connect/reducer/test/jetpack-auth-attempts.js b/client/state/jetpack-connect/reducer/test/jetpack-auth-attempts.js new file mode 100644 index 0000000000000..791c6875b48fb --- /dev/null +++ b/client/state/jetpack-connect/reducer/test/jetpack-auth-attempts.js @@ -0,0 +1,63 @@ +/** @format */ +/** + * External dependencies + */ +import { expect } from 'chai'; + +/** + * Internal dependencies + */ +import jetpackAuthAttempts from '../jetpack-auth-attempts'; +import { JETPACK_CONNECT_RETRY_AUTH } from 'state/action-types'; + +describe( '#jetpackAuthAttempts()', () => { + test( 'should default to an empty object', () => { + const state = jetpackAuthAttempts( undefined, {} ); + expect( state ).to.eql( {} ); + } ); + + test( 'should update the timestamp when adding an existent slug with stale timestamp', () => { + const nowTime = Date.now(); + const state = jetpackAuthAttempts( + { 'example.com': { timestamp: 1, attempt: 1 } }, + { + type: JETPACK_CONNECT_RETRY_AUTH, + slug: 'example.com', + attemptNumber: 2, + } + ); + expect( state[ 'example.com' ] ) + .to.have.property( 'timestamp' ) + .to.be.at.least( nowTime ); + } ); + + test( 'should reset the attempt number to 0 when adding an existent slug with stale timestamp', () => { + const state = jetpackAuthAttempts( + { 'example.com': { timestamp: 1, attempt: 1 } }, + { + type: JETPACK_CONNECT_RETRY_AUTH, + slug: 'example.com', + attemptNumber: 2, + } + ); + + expect( state[ 'example.com' ] ) + .to.have.property( 'attempt' ) + .to.equals( 0 ); + } ); + + test( 'should store the attempt number when adding an existent slug with non-stale timestamp', () => { + const state = jetpackAuthAttempts( + { 'example.com': { timestamp: Date.now(), attempt: 1 } }, + { + type: JETPACK_CONNECT_RETRY_AUTH, + slug: 'example.com', + attemptNumber: 2, + } + ); + + expect( state[ 'example.com' ] ) + .to.have.property( 'attempt' ) + .to.equals( 2 ); + } ); +} ); diff --git a/client/state/jetpack-connect/reducer/test/jetpack-connect-authorize.js b/client/state/jetpack-connect/reducer/test/jetpack-connect-authorize.js new file mode 100644 index 0000000000000..cb5c8f13522ec --- /dev/null +++ b/client/state/jetpack-connect/reducer/test/jetpack-connect-authorize.js @@ -0,0 +1,329 @@ +/** @format */ +/** + * External dependencies + */ +import { expect } from 'chai'; +import deepFreeze from 'deep-freeze'; + +/** + * Internal dependencies + */ +import jetpackConnectAuthorize from '../jetpack-connect-authorize.js'; +import { + DESERIALIZE, + JETPACK_CONNECT_AUTHORIZE, + JETPACK_CONNECT_AUTHORIZE_LOGIN_COMPLETE, + JETPACK_CONNECT_AUTHORIZE_RECEIVE, + JETPACK_CONNECT_AUTHORIZE_RECEIVE_SITE_LIST, + JETPACK_CONNECT_CREATE_ACCOUNT, + JETPACK_CONNECT_CREATE_ACCOUNT_RECEIVE, + JETPACK_CONNECT_QUERY_SET, + JETPACK_CONNECT_REDIRECT_WP_ADMIN, + JETPACK_CONNECT_REDIRECT_XMLRPC_ERROR_FALLBACK_URL, + SERIALIZE, + SITE_REQUEST_FAILURE, +} from 'state/action-types'; + +import { useSandbox } from 'test/helpers/use-sinon'; + +describe( '#jetpackConnectAuthorize()', () => { + useSandbox( sandbox => { + sandbox.stub( console, 'warn' ); + } ); + + test( 'should default to an empty object', () => { + const state = jetpackConnectAuthorize( undefined, {} ); + expect( state ).to.eql( {} ); + } ); + + test( 'should set isAuthorizing to true when starting authorization', () => { + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_AUTHORIZE, + } ); + + expect( state ).to.have.property( 'isAuthorizing' ).to.be.true; + expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; + expect( state ).to.have.property( 'authorizeError' ).to.be.false; + expect( state ).to.have.property( 'isRedirectingToWpAdmin' ).to.be.false; + expect( state ).to.have.property( 'autoAuthorize' ).to.be.false; + } ); + + test( 'should omit userData and bearerToken when starting authorization', () => { + const state = jetpackConnectAuthorize( + { + userData: { + ID: 123, + email: 'example@example.com', + }, + bearerToken: 'abcd1234', + }, + { + type: JETPACK_CONNECT_AUTHORIZE, + } + ); + + expect( state ).to.not.have.property( 'userData' ); + expect( state ).to.not.have.property( 'bearerToken' ); + } ); + + test( 'should set authorizeSuccess to true when completed authorization successfully', () => { + const data = { + plans_url: 'https://wordpress.com/jetpack/connect/plans/', + }; + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_AUTHORIZE_RECEIVE, + data, + } ); + + expect( state ).to.have.property( 'authorizeError' ).to.be.false; + expect( state ).to.have.property( 'authorizeSuccess' ).to.be.true; + expect( state ).to.have.property( 'autoAuthorize' ).to.be.false; + expect( state ) + .to.have.property( 'plansUrl' ) + .to.eql( data.plans_url ); + expect( state ).to.have.property( 'siteReceived' ).to.be.false; + } ); + + test( 'should set authorizeSuccess to false when an error occurred during authorization', () => { + const error = 'You need to stay logged in to your WordPress blog while you authorize Jetpack.'; + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_AUTHORIZE_RECEIVE, + error, + } ); + + expect( state ).to.have.property( 'isAuthorizing' ).to.be.false; + expect( state ) + .to.have.property( 'authorizeError' ) + .to.eql( error ); + expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; + expect( state ).to.have.property( 'autoAuthorize' ).to.be.false; + } ); + + test( 'should set authorization code when login is completed', () => { + const code = 'abcd1234efgh5678'; + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_AUTHORIZE_LOGIN_COMPLETE, + data: { + code, + }, + } ); + + expect( state ) + .to.have.property( 'authorizationCode' ) + .to.eql( code ); + } ); + + test( 'should set siteReceived to true and omit some query object properties when received site list', () => { + const state = jetpackConnectAuthorize( + { + queryObject: { + _wp_nonce: 'testnonce', + client_id: 'example.com', + redirect_uri: 'https://example.com/', + scope: 'auth', + secret: 'abcd1234', + site: 'https://example.com/', + state: 1234567890, + }, + }, + { + type: JETPACK_CONNECT_AUTHORIZE_RECEIVE_SITE_LIST, + } + ); + + expect( state ).to.have.property( 'siteReceived' ).to.be.true; + expect( state ).to.have.property( 'isAuthorizing' ).to.be.false; + expect( state ) + .to.have.property( 'queryObject' ) + .to.eql( { + client_id: 'example.com', + redirect_uri: 'https://example.com/', + site: 'https://example.com/', + state: 1234567890, + } ); + } ); + + test( 'should use default authorize state when setting an empty connect query', () => { + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_QUERY_SET, + } ); + + expect( state ) + .to.have.property( 'queryObject' ) + .to.eql( {} ); + expect( state ).to.have.property( 'isAuthorizing' ).to.be.false; + expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; + expect( state ).to.have.property( 'authorizeError' ).to.be.false; + } ); + + test( 'should use new query object over default authorize state when setting a connect query', () => { + const queryObject = { + redirect_uri: 'https://example.wordpress.com', + }; + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_QUERY_SET, + queryObject, + } ); + + expect( state ) + .to.have.property( 'queryObject' ) + .to.eql( queryObject ); + expect( state ).to.have.property( 'isAuthorizing' ).to.be.false; + expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; + expect( state ).to.have.property( 'authorizeError' ).to.be.false; + } ); + + test( 'should set isAuthorizing and autoAuthorize to true when initiating an account creation', () => { + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_CREATE_ACCOUNT, + } ); + + expect( state ).to.have.property( 'isAuthorizing' ).to.be.true; + expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; + expect( state ).to.have.property( 'authorizeError' ).to.be.false; + expect( state ).to.have.property( 'autoAuthorize' ).to.be.true; + } ); + + test( 'should receive userData and bearerToken on successful account creation', () => { + const userData = { + ID: 123, + email: 'example@example.com', + }; + const bearer_token = 'abcd1234'; + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_CREATE_ACCOUNT_RECEIVE, + userData, + data: { + bearer_token, + }, + } ); + + expect( state ).to.have.property( 'isAuthorizing' ).to.be.true; + expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; + expect( state ).to.have.property( 'authorizeError' ).to.be.false; + expect( state ).to.have.property( 'autoAuthorize' ).to.be.true; + expect( state ) + .to.have.property( 'userData' ) + .to.eql( userData ); + expect( state ) + .to.have.property( 'bearerToken' ) + .to.eql( bearer_token ); + } ); + + test( 'should mark authorizeError as true on unsuccessful account creation', () => { + const error = 'Sorry, that username already exists!'; + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_CREATE_ACCOUNT_RECEIVE, + error, + } ); + + expect( state ).to.have.property( 'isAuthorizing' ).to.be.false; + expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; + expect( state ).to.have.property( 'authorizeError' ).to.be.true; + expect( state ).to.have.property( 'autoAuthorize' ).to.be.false; + } ); + + test( 'should set isRedirectingToWpAdmin to true when an xmlrpc error occurs', () => { + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_REDIRECT_XMLRPC_ERROR_FALLBACK_URL, + } ); + + expect( state ).to.have.property( 'isRedirectingToWpAdmin' ).to.be.true; + } ); + + test( 'should set isRedirectingToWpAdmin to true when a redirect to wp-admin is triggered', () => { + const state = jetpackConnectAuthorize( undefined, { + type: JETPACK_CONNECT_REDIRECT_WP_ADMIN, + } ); + + expect( state ).to.have.property( 'isRedirectingToWpAdmin' ).to.be.true; + } ); + + test( 'should set clientNotResponding when a site request to current client fails', () => { + const state = jetpackConnectAuthorize( + { queryObject: { client_id: '123' } }, + { type: SITE_REQUEST_FAILURE, siteId: 123 } + ); + expect( state ).to.have.property( 'clientNotResponding' ).to.be.true; + } ); + + test( 'should return the given state when a site request fails on a different site', () => { + const originalState = { queryObject: { client_id: '123' } }; + const state = jetpackConnectAuthorize( originalState, { + type: SITE_REQUEST_FAILURE, + siteId: 234, + } ); + expect( state ).to.eql( originalState ); + } ); + + test( 'should return the given state when a site request fails and no client id is set', () => { + const originalState = { queryObject: { jetpack_version: '4.0' } }; + const state = jetpackConnectAuthorize( originalState, { + type: SITE_REQUEST_FAILURE, + siteId: 123, + } ); + expect( state ).to.eql( originalState ); + } ); + + test( 'should return the given state when a site request fails and no query object is set', () => { + const originalState = { isAuthorizing: false }; + const state = jetpackConnectAuthorize( originalState, { + type: SITE_REQUEST_FAILURE, + siteId: 123, + } ); + expect( state ).to.eql( originalState ); + } ); + + test( 'should persist state when a site request to a different client fails', () => { + const state = jetpackConnectAuthorize( + { queryObject: { client_id: '123' } }, + { type: SITE_REQUEST_FAILURE, siteId: 456 } + ); + expect( state ).to.eql( { queryObject: { client_id: '123' } } ); + } ); + + test( 'should persist state', () => { + const originalState = deepFreeze( { + queryObject: { + client_id: 'example.com', + redirect_uri: 'https://example.com/', + }, + timestamp: Date.now(), + } ); + const state = jetpackConnectAuthorize( originalState, { + type: SERIALIZE, + } ); + + expect( state ).to.be.eql( originalState ); + } ); + + test( 'should load valid persisted state', () => { + const originalState = deepFreeze( { + queryObject: { + client_id: 'example.com', + redirect_uri: 'https://example.com/', + }, + timestamp: Date.now(), + } ); + const state = jetpackConnectAuthorize( originalState, { + type: DESERIALIZE, + } ); + + expect( state ).to.be.eql( originalState ); + } ); + + test( 'should not load stale state', () => { + const originalState = deepFreeze( { + queryObject: { + client_id: 'example.com', + redirect_uri: 'https://example.com/', + }, + timestamp: 1, + } ); + const state = jetpackConnectAuthorize( originalState, { + type: DESERIALIZE, + } ); + + expect( state ).to.be.eql( {} ); + } ); +} ); diff --git a/client/state/jetpack-connect/reducer/test/jetpack-connect-sessions.js b/client/state/jetpack-connect/reducer/test/jetpack-connect-sessions.js new file mode 100644 index 0000000000000..1d8578e0e431c --- /dev/null +++ b/client/state/jetpack-connect/reducer/test/jetpack-connect-sessions.js @@ -0,0 +1,157 @@ +/** @format */ +/** + * External dependencies + */ +import { expect } from 'chai'; + +/** + * Internal dependencies + */ +import jetpackConnectSessions from '../jetpack-connect-sessions'; +import { DESERIALIZE, JETPACK_CONNECT_CHECK_URL } from 'state/action-types'; + +import { useSandbox } from 'test/helpers/use-sinon'; + +describe( '#jetpackConnectSessions()', () => { + useSandbox( sandbox => { + sandbox.stub( console, 'warn' ); + } ); + + test( 'should default to an empty object', () => { + const state = jetpackConnectSessions( undefined, {} ); + expect( state ).to.eql( {} ); + } ); + + test( 'should add the url slug as a new property when checking a new url', () => { + const state = jetpackConnectSessions( undefined, { + type: JETPACK_CONNECT_CHECK_URL, + url: 'https://example.wordpress.com', + } ); + + expect( state ) + .to.have.property( 'example.wordpress.com' ) + .to.be.a( 'object' ); + } ); + + test( 'should convert forward slashes to double colon when checking a new url', () => { + const state = jetpackConnectSessions( undefined, { + type: JETPACK_CONNECT_CHECK_URL, + url: 'https://example.wordpress.com/example123', + } ); + + expect( state ) + .to.have.property( 'example.wordpress.com::example123' ) + .to.be.a( 'object' ); + } ); + + test( 'should store a timestamp when checking a new url', () => { + const nowTime = Date.now(); + const state = jetpackConnectSessions( undefined, { + type: JETPACK_CONNECT_CHECK_URL, + url: 'https://example.wordpress.com', + } ); + + expect( state[ 'example.wordpress.com' ] ) + .to.have.property( 'timestamp' ) + .to.be.at.least( nowTime ); + } ); + + test( 'should update the timestamp when checking an existent url', () => { + const nowTime = Date.now(); + const state = jetpackConnectSessions( + { 'example.wordpress.com': { timestamp: 1 } }, + { + type: JETPACK_CONNECT_CHECK_URL, + url: 'https://example.wordpress.com', + } + ); + + expect( state[ 'example.wordpress.com' ] ) + .to.have.property( 'timestamp' ) + .to.be.at.least( nowTime ); + } ); + + test( 'should not restore a state with a property without a timestamp', () => { + const state = jetpackConnectSessions( + { 'example.wordpress.com': {} }, + { + type: DESERIALIZE, + } + ); + + expect( state ).to.be.eql( {} ); + } ); + + test( 'should not restore a state with a property with a non-integer timestamp', () => { + const state = jetpackConnectSessions( + { 'example.wordpress.com': { timestamp: '1' } }, + { + type: DESERIALIZE, + } + ); + + expect( state ).to.be.eql( {} ); + } ); + + test( 'should not restore a state with a property with a stale timestamp', () => { + const state = jetpackConnectSessions( + { 'example.wordpress.com': { timestamp: 1 } }, + { + type: DESERIALIZE, + } + ); + + expect( state ).to.be.eql( {} ); + } ); + + test( 'should not restore a state with a session stored with extra properties', () => { + const timestamp = Date.now(); + const state = jetpackConnectSessions( + { 'example.wordpress.com': { timestamp, foo: 'bar' } }, + { + type: DESERIALIZE, + } + ); + + expect( state ).to.be.eql( {} ); + } ); + + test( 'should restore a valid state', () => { + const timestamp = Date.now(); + const state = jetpackConnectSessions( + { 'example.wordpress.com': { timestamp } }, + { + type: DESERIALIZE, + } + ); + + expect( state ).to.be.eql( { 'example.wordpress.com': { timestamp } } ); + } ); + + test( 'should restore a valid state including dashes, slashes and semicolons', () => { + const timestamp = Date.now(); + const state = jetpackConnectSessions( + { 'https://example.wordpress.com:3000/test-one': { timestamp } }, + { + type: DESERIALIZE, + } + ); + + expect( state ).to.be.eql( { 'https://example.wordpress.com:3000/test-one': { timestamp } } ); + } ); + + test( 'should restore only sites with non-stale timestamps', () => { + const timestamp = Date.now(); + const state = jetpackConnectSessions( + { + 'example.wordpress.com': { timestamp: 1 }, + 'automattic.wordpress.com': { timestamp }, + }, + { + type: DESERIALIZE, + } + ); + + expect( state ).to.be.eql( { 'automattic.wordpress.com': { timestamp } } ); + } ); +} ); diff --git a/client/state/jetpack-connect/reducer/test/jetpack-connect-site.js b/client/state/jetpack-connect/reducer/test/jetpack-connect-site.js new file mode 100644 index 0000000000000..85d6ca9f9ae5b --- /dev/null +++ b/client/state/jetpack-connect/reducer/test/jetpack-connect-site.js @@ -0,0 +1,149 @@ +/** @format */ +/** + * External dependencies + */ +import { expect } from 'chai'; + +/** + * Internal dependencies + */ +import jetpackConnectSite from '../jetpack-connect-site'; +import { + JETPACK_CONNECT_CHECK_URL, + JETPACK_CONNECT_CHECK_URL_RECEIVE, + JETPACK_CONNECT_CONFIRM_JETPACK_STATUS, + JETPACK_CONNECT_DISMISS_URL_STATUS, + JETPACK_CONNECT_REDIRECT, +} from 'state/action-types'; + +describe( '#jetpackConnectSite()', () => { + test( 'should default to an empty object', () => { + const state = jetpackConnectSite( undefined, {} ); + + expect( state ).to.eql( {} ); + } ); + + test( 'should add the url and mark it as currently fetching', () => { + const state = jetpackConnectSite( undefined, { + type: JETPACK_CONNECT_CHECK_URL, + url: 'https://example.wordpress.com', + } ); + + expect( state ) + .to.have.property( 'url' ) + .to.eql( 'https://example.wordpress.com' ); + expect( state ).to.have.property( 'isFetching' ).to.be.true; + expect( state ).to.have.property( 'isFetched' ).to.be.false; + expect( state ).to.have.property( 'isDismissed' ).to.be.false; + expect( state ).to.have.property( 'installConfirmedByUser' ).to.be.null; + expect( state ) + .to.have.property( 'data' ) + .to.eql( {} ); + } ); + + test( 'should mark the url as fetched if it is the current one', () => { + const data = { + exists: true, + isWordPress: true, + hasJetpack: true, + isJetpackActive: true, + isWordPressDotCom: false, + }; + const state = jetpackConnectSite( + { url: 'https://example.wordpress.com' }, + { + type: JETPACK_CONNECT_CHECK_URL_RECEIVE, + url: 'https://example.wordpress.com', + data: data, + } + ); + + expect( state ).to.have.property( 'isFetching' ).to.be.false; + expect( state ).to.have.property( 'isFetched' ).to.be.true; + expect( state ) + .to.have.property( 'data' ) + .to.eql( data ); + } ); + + test( 'should not mark the url as fetched if it is not the current one', () => { + const data = { + exists: true, + isWordPress: true, + hasJetpack: true, + isJetpackActive: true, + isWordPressDotCom: false, + }; + const state = jetpackConnectSite( + { url: 'https://automattic.com' }, + { + type: JETPACK_CONNECT_CHECK_URL_RECEIVE, + url: 'https://example.wordpress.com', + data: data, + } + ); + + expect( state ).to.eql( { url: 'https://automattic.com' } ); + expect( state ).to.not.have.property( 'isFetched' ); + } ); + + test( 'should mark the url as dismissed if it is the current one', () => { + const state = jetpackConnectSite( + { url: 'https://example.wordpress.com' }, + { + type: JETPACK_CONNECT_DISMISS_URL_STATUS, + url: 'https://example.wordpress.com', + } + ); + + expect( state ).to.have.property( 'installConfirmedByUser' ).to.be.null; + expect( state ).to.have.property( 'isDismissed' ).to.be.true; + } ); + + test( 'should not mark the url as dismissed if it is not the current one', () => { + const state = jetpackConnectSite( + { url: 'https://automattic.com' }, + { + type: JETPACK_CONNECT_DISMISS_URL_STATUS, + url: 'https://example.wordpress.com', + } + ); + + expect( state ).to.eql( { url: 'https://automattic.com' } ); + } ); + + test( 'should schedule a redirect to the url if it is the current one', () => { + const state = jetpackConnectSite( + { url: 'https://example.wordpress.com' }, + { + type: JETPACK_CONNECT_REDIRECT, + url: 'https://example.wordpress.com', + } + ); + + expect( state ).to.have.property( 'isRedirecting' ).to.be.true; + } ); + + test( 'should not schedule a redirect to the url if it is not the current one', () => { + const state = jetpackConnectSite( + { url: 'https://automattic.com' }, + { + type: JETPACK_CONNECT_REDIRECT, + url: 'https://example.wordpress.com', + } + ); + + expect( state ).to.eql( { url: 'https://automattic.com' } ); + } ); + + test( 'should set the jetpack confirmed status to the new one', () => { + const state = jetpackConnectSite( + { url: 'https://example.wordpress.com' }, + { + type: JETPACK_CONNECT_CONFIRM_JETPACK_STATUS, + status: true, + } + ); + + expect( state ).to.have.property( 'installConfirmedByUser' ).to.be.true; + } ); +} ); diff --git a/client/state/jetpack-connect/reducer/test/jetpack-sso.js b/client/state/jetpack-connect/reducer/test/jetpack-sso.js new file mode 100644 index 0000000000000..f3284733a7870 --- /dev/null +++ b/client/state/jetpack-connect/reducer/test/jetpack-sso.js @@ -0,0 +1,145 @@ +/** @format */ +/** + * External dependencies + */ +import deepFreeze from 'deep-freeze'; +import { expect } from 'chai'; + +/** + * Internal dependencies + */ +import jetpackSSO from '../jetpack-sso'; +import { + JETPACK_CONNECT_SSO_AUTHORIZE_ERROR, + JETPACK_CONNECT_SSO_AUTHORIZE_REQUEST, + JETPACK_CONNECT_SSO_AUTHORIZE_SUCCESS, + JETPACK_CONNECT_SSO_VALIDATION_ERROR, + JETPACK_CONNECT_SSO_VALIDATION_REQUEST, + JETPACK_CONNECT_SSO_VALIDATION_SUCCESS, +} from 'state/action-types'; + +const successfulSSOValidation = { + type: JETPACK_CONNECT_SSO_VALIDATION_SUCCESS, + success: true, + blogDetails: { + domain: 'example.wordpress.com', + title: 'My BBQ Site', + icon: { + img: '', + ico: '', + }, + URL: 'https://example.wordpress.com', + admin_url: 'https://example.wordpress.com/wp-admin', + }, + sharedDetails: { + ID: 0, + login: 'bbquser', + email: 'ieatbbq@example.wordpress.com', + url: 'https://example.wordpress.com', + first_name: 'Lou', + last_name: 'Bucket', + display_name: 'bestbbqtester', + description: 'I like BBQ, a lot.', + two_step_enabled: 0, + external_user_id: 1, + }, +}; + +const falseSSOValidation = Object.assign( successfulSSOValidation, { success: false } ); + +describe( '#jetpackSSO()', () => { + test( 'should default to an empty object', () => { + const state = jetpackSSO( undefined, {} ); + expect( state ).to.eql( {} ); + } ); + + test( 'should set isValidating to true when validating', () => { + const state = jetpackSSO( undefined, { + type: JETPACK_CONNECT_SSO_VALIDATION_REQUEST, + } ); + + expect( state ).to.have.property( 'isValidating', true ); + } ); + + test( 'should set isAuthorizing to true when authorizing', () => { + const state = jetpackSSO( undefined, { + type: JETPACK_CONNECT_SSO_AUTHORIZE_REQUEST, + } ); + + expect( state ).to.have.property( 'isAuthorizing', true ); + } ); + + test( 'should set isValidating to false after validation', () => { + const actions = [ + successfulSSOValidation, + { + type: JETPACK_CONNECT_SSO_VALIDATION_ERROR, + error: { + statusCode: 400, + }, + }, + ]; + + actions.forEach( action => { + const state = jetpackSSO( undefined, action ); + expect( state ).to.have.property( 'isValidating', false ); + } ); + } ); + + test( 'should store boolean nonceValid after validation', () => { + const actions = [ successfulSSOValidation, falseSSOValidation ]; + + actions.forEach( action => { + const originalAction = deepFreeze( action ); + const state = jetpackSSO( undefined, originalAction ); + expect( state ).to.have.property( 'nonceValid', originalAction.success ); + } ); + } ); + + test( 'should store blog details after validation', () => { + const successState = jetpackSSO( undefined, successfulSSOValidation ); + expect( successState ) + .to.have.property( 'blogDetails' ) + .to.be.eql( successfulSSOValidation.blogDetails ); + } ); + + test( 'should store shared details after validation', () => { + const successState = jetpackSSO( undefined, successfulSSOValidation ); + expect( successState ) + .to.have.property( 'sharedDetails' ) + .to.be.eql( successfulSSOValidation.sharedDetails ); + } ); + + test( 'should set isAuthorizing to false after authorization', () => { + const actions = [ + { + type: JETPACK_CONNECT_SSO_AUTHORIZE_SUCCESS, + ssoUrl: 'http://example.wordpress.com', + siteUrl: 'http://example.wordpress.com', + }, + { + type: JETPACK_CONNECT_SSO_AUTHORIZE_ERROR, + error: { + statusCode: 400, + }, + }, + ]; + + actions.forEach( action => { + const state = jetpackSSO( undefined, action ); + expect( state ).to.have.property( 'isAuthorizing', false ); + } ); + } ); + + test( 'should store sso_url after authorization', () => { + const action = deepFreeze( { + type: JETPACK_CONNECT_SSO_AUTHORIZE_SUCCESS, + ssoUrl: 'http://example.wordpress.com', + siteUrl: 'http://example.wordpress.com', + } ); + + const state = jetpackSSO( undefined, action ); + + expect( state ).to.have.property( 'ssoUrl', action.ssoUrl ); + } ); +} ); diff --git a/client/state/jetpack-connect/test/reducer.js b/client/state/jetpack-connect/test/reducer.js deleted file mode 100644 index 3fb61f9cf6681..0000000000000 --- a/client/state/jetpack-connect/test/reducer.js +++ /dev/null @@ -1,811 +0,0 @@ -/** @format */ - -/** - * External dependencies - */ -import { expect } from 'chai'; -import deepFreeze from 'deep-freeze'; - -/** - * Internal dependencies - */ -import reducer, { - jetpackConnectAuthorize, - jetpackSSO, - jetpackConnectSessions, - jetpackConnectSite, - jetpackAuthAttempts, -} from '../reducer'; -import { - JETPACK_CONNECT_SSO_AUTHORIZE_REQUEST, - JETPACK_CONNECT_SSO_AUTHORIZE_SUCCESS, - JETPACK_CONNECT_SSO_AUTHORIZE_ERROR, - JETPACK_CONNECT_SSO_VALIDATION_REQUEST, - JETPACK_CONNECT_SSO_VALIDATION_SUCCESS, - JETPACK_CONNECT_SSO_VALIDATION_ERROR, - JETPACK_CONNECT_CHECK_URL, - JETPACK_CONNECT_CHECK_URL_RECEIVE, - JETPACK_CONNECT_DISMISS_URL_STATUS, - JETPACK_CONNECT_REDIRECT, - JETPACK_CONNECT_CONFIRM_JETPACK_STATUS, - JETPACK_CONNECT_AUTHORIZE, - JETPACK_CONNECT_AUTHORIZE_RECEIVE, - JETPACK_CONNECT_AUTHORIZE_LOGIN_COMPLETE, - JETPACK_CONNECT_AUTHORIZE_RECEIVE_SITE_LIST, - JETPACK_CONNECT_QUERY_SET, - JETPACK_CONNECT_CREATE_ACCOUNT, - JETPACK_CONNECT_CREATE_ACCOUNT_RECEIVE, - JETPACK_CONNECT_REDIRECT_XMLRPC_ERROR_FALLBACK_URL, - JETPACK_CONNECT_REDIRECT_WP_ADMIN, - JETPACK_CONNECT_RETRY_AUTH, - SITE_REQUEST_FAILURE, - SERIALIZE, - DESERIALIZE, -} from 'state/action-types'; - -import { useSandbox } from 'test/helpers/use-sinon'; - -const successfulSSOValidation = { - type: JETPACK_CONNECT_SSO_VALIDATION_SUCCESS, - success: true, - blogDetails: { - domain: 'example.wordpress.com', - title: 'My BBQ Site', - icon: { - img: '', - ico: '', - }, - URL: 'https://example.wordpress.com', - admin_url: 'https://example.wordpress.com/wp-admin', - }, - sharedDetails: { - ID: 0, - login: 'bbquser', - email: 'ieatbbq@example.wordpress.com', - url: 'https://example.wordpress.com', - first_name: 'Lou', - last_name: 'Bucket', - display_name: 'bestbbqtester', - description: 'I like BBQ, a lot.', - two_step_enabled: 0, - external_user_id: 1, - }, -}; - -const falseSSOValidation = Object.assign( successfulSSOValidation, { success: false } ); - -describe( 'reducer', () => { - useSandbox( sandbox => { - sandbox.stub( console, 'warn' ); - } ); - - test( 'should export expected reducer keys', () => { - expect( reducer( undefined, {} ) ).to.have.keys( [ - 'jetpackConnectSite', - 'jetpackConnectAuthorize', - 'jetpackConnectSessions', - 'jetpackSSO', - 'jetpackConnectSelectedPlans', - 'jetpackAuthAttempts', - ] ); - } ); - - describe( '#jetpackConnectSessions()', () => { - test( 'should default to an empty object', () => { - const state = jetpackConnectSessions( undefined, {} ); - expect( state ).to.eql( {} ); - } ); - - test( 'should add the url slug as a new property when checking a new url', () => { - const state = jetpackConnectSessions( undefined, { - type: JETPACK_CONNECT_CHECK_URL, - url: 'https://example.wordpress.com', - } ); - - expect( state ) - .to.have.property( 'example.wordpress.com' ) - .to.be.a( 'object' ); - } ); - - test( 'should convert forward slashes to double colon when checking a new url', () => { - const state = jetpackConnectSessions( undefined, { - type: JETPACK_CONNECT_CHECK_URL, - url: 'https://example.wordpress.com/example123', - } ); - - expect( state ) - .to.have.property( 'example.wordpress.com::example123' ) - .to.be.a( 'object' ); - } ); - - test( 'should store a timestamp when checking a new url', () => { - const nowTime = Date.now(); - const state = jetpackConnectSessions( undefined, { - type: JETPACK_CONNECT_CHECK_URL, - url: 'https://example.wordpress.com', - } ); - - expect( state[ 'example.wordpress.com' ] ) - .to.have.property( 'timestamp' ) - .to.be.at.least( nowTime ); - } ); - - test( 'should update the timestamp when checking an existent url', () => { - const nowTime = Date.now(); - const state = jetpackConnectSessions( - { 'example.wordpress.com': { timestamp: 1 } }, - { - type: JETPACK_CONNECT_CHECK_URL, - url: 'https://example.wordpress.com', - } - ); - - expect( state[ 'example.wordpress.com' ] ) - .to.have.property( 'timestamp' ) - .to.be.at.least( nowTime ); - } ); - - test( 'should not restore a state with a property without a timestamp', () => { - const state = jetpackConnectSessions( - { 'example.wordpress.com': {} }, - { - type: DESERIALIZE, - } - ); - - expect( state ).to.be.eql( {} ); - } ); - - test( 'should not restore a state with a property with a non-integer timestamp', () => { - const state = jetpackConnectSessions( - { 'example.wordpress.com': { timestamp: '1' } }, - { - type: DESERIALIZE, - } - ); - - expect( state ).to.be.eql( {} ); - } ); - - test( 'should not restore a state with a property with a stale timestamp', () => { - const state = jetpackConnectSessions( - { 'example.wordpress.com': { timestamp: 1 } }, - { - type: DESERIALIZE, - } - ); - - expect( state ).to.be.eql( {} ); - } ); - - test( 'should not restore a state with a session stored with extra properties', () => { - const timestamp = Date.now(); - const state = jetpackConnectSessions( - { 'example.wordpress.com': { timestamp, foo: 'bar' } }, - { - type: DESERIALIZE, - } - ); - - expect( state ).to.be.eql( {} ); - } ); - - test( 'should restore a valid state', () => { - const timestamp = Date.now(); - const state = jetpackConnectSessions( - { 'example.wordpress.com': { timestamp } }, - { - type: DESERIALIZE, - } - ); - - expect( state ).to.be.eql( { 'example.wordpress.com': { timestamp } } ); - } ); - - test( 'should restore a valid state including dashes, slashes and semicolons', () => { - const timestamp = Date.now(); - const state = jetpackConnectSessions( - { 'https://example.wordpress.com:3000/test-one': { timestamp } }, - { - type: DESERIALIZE, - } - ); - - expect( state ).to.be.eql( { 'https://example.wordpress.com:3000/test-one': { timestamp } } ); - } ); - - test( 'should restore only sites with non-stale timestamps', () => { - const timestamp = Date.now(); - const state = jetpackConnectSessions( - { - 'example.wordpress.com': { timestamp: 1 }, - 'automattic.wordpress.com': { timestamp }, - }, - { - type: DESERIALIZE, - } - ); - - expect( state ).to.be.eql( { 'automattic.wordpress.com': { timestamp } } ); - } ); - } ); - - describe( '#jetpackConnectSite()', () => { - test( 'should default to an empty object', () => { - const state = jetpackConnectSite( undefined, {} ); - - expect( state ).to.eql( {} ); - } ); - - test( 'should add the url and mark it as currently fetching', () => { - const state = jetpackConnectSite( undefined, { - type: JETPACK_CONNECT_CHECK_URL, - url: 'https://example.wordpress.com', - } ); - - expect( state ) - .to.have.property( 'url' ) - .to.eql( 'https://example.wordpress.com' ); - expect( state ).to.have.property( 'isFetching' ).to.be.true; - expect( state ).to.have.property( 'isFetched' ).to.be.false; - expect( state ).to.have.property( 'isDismissed' ).to.be.false; - expect( state ).to.have.property( 'installConfirmedByUser' ).to.be.null; - expect( state ) - .to.have.property( 'data' ) - .to.eql( {} ); - } ); - - test( 'should mark the url as fetched if it is the current one', () => { - const data = { - exists: true, - isWordPress: true, - hasJetpack: true, - isJetpackActive: true, - isWordPressDotCom: false, - }; - const state = jetpackConnectSite( - { url: 'https://example.wordpress.com' }, - { - type: JETPACK_CONNECT_CHECK_URL_RECEIVE, - url: 'https://example.wordpress.com', - data: data, - } - ); - - expect( state ).to.have.property( 'isFetching' ).to.be.false; - expect( state ).to.have.property( 'isFetched' ).to.be.true; - expect( state ) - .to.have.property( 'data' ) - .to.eql( data ); - } ); - - test( 'should not mark the url as fetched if it is not the current one', () => { - const data = { - exists: true, - isWordPress: true, - hasJetpack: true, - isJetpackActive: true, - isWordPressDotCom: false, - }; - const state = jetpackConnectSite( - { url: 'https://automattic.com' }, - { - type: JETPACK_CONNECT_CHECK_URL_RECEIVE, - url: 'https://example.wordpress.com', - data: data, - } - ); - - expect( state ).to.eql( { url: 'https://automattic.com' } ); - } ); - - test( 'should mark the url as dismissed if it is the current one', () => { - const state = jetpackConnectSite( - { url: 'https://example.wordpress.com' }, - { - type: JETPACK_CONNECT_DISMISS_URL_STATUS, - url: 'https://example.wordpress.com', - } - ); - - expect( state ).to.have.property( 'installConfirmedByUser' ).to.be.null; - expect( state ).to.have.property( 'isDismissed' ).to.be.true; - } ); - - test( 'should not mark the url as dismissed if it is not the current one', () => { - const state = jetpackConnectSite( - { url: 'https://automattic.com' }, - { - type: JETPACK_CONNECT_DISMISS_URL_STATUS, - url: 'https://example.wordpress.com', - } - ); - - expect( state ).to.eql( { url: 'https://automattic.com' } ); - } ); - - test( 'should schedule a redirect to the url if it is the current one', () => { - const state = jetpackConnectSite( - { url: 'https://example.wordpress.com' }, - { - type: JETPACK_CONNECT_REDIRECT, - url: 'https://example.wordpress.com', - } - ); - - expect( state ).to.have.property( 'isRedirecting' ).to.be.true; - } ); - - test( 'should not schedule a redirect to the url if it is not the current one', () => { - const state = jetpackConnectSite( - { url: 'https://automattic.com' }, - { - type: JETPACK_CONNECT_REDIRECT, - url: 'https://example.wordpress.com', - } - ); - - expect( state ).to.eql( { url: 'https://automattic.com' } ); - } ); - - test( 'should set the jetpack confirmed status to the new one', () => { - const state = jetpackConnectSite( - { url: 'https://example.wordpress.com' }, - { - type: JETPACK_CONNECT_CONFIRM_JETPACK_STATUS, - status: true, - } - ); - - expect( state ).to.have.property( 'installConfirmedByUser' ).to.be.true; - } ); - } ); - - describe( '#jetpackConnectAuthorize()', () => { - test( 'should default to an empty object', () => { - const state = jetpackConnectAuthorize( undefined, {} ); - expect( state ).to.eql( {} ); - } ); - - test( 'should set isAuthorizing to true when starting authorization', () => { - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_AUTHORIZE, - } ); - - expect( state ).to.have.property( 'isAuthorizing' ).to.be.true; - expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; - expect( state ).to.have.property( 'authorizeError' ).to.be.false; - expect( state ).to.have.property( 'isRedirectingToWpAdmin' ).to.be.false; - expect( state ).to.have.property( 'autoAuthorize' ).to.be.false; - } ); - - test( 'should omit userData and bearerToken when starting authorization', () => { - const state = jetpackConnectAuthorize( - { - userData: { - ID: 123, - email: 'example@example.com', - }, - bearerToken: 'abcd1234', - }, - { - type: JETPACK_CONNECT_AUTHORIZE, - } - ); - - expect( state ).to.not.have.property( 'userData' ); - expect( state ).to.not.have.property( 'bearerToken' ); - } ); - - test( 'should set authorizeSuccess to true when completed authorization successfully', () => { - const data = { - plans_url: 'https://wordpress.com/jetpack/connect/plans/', - }; - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_AUTHORIZE_RECEIVE, - data, - } ); - - expect( state ).to.have.property( 'authorizeError' ).to.be.false; - expect( state ).to.have.property( 'authorizeSuccess' ).to.be.true; - expect( state ).to.have.property( 'autoAuthorize' ).to.be.false; - expect( state ) - .to.have.property( 'plansUrl' ) - .to.eql( data.plans_url ); - expect( state ).to.have.property( 'siteReceived' ).to.be.false; - } ); - - test( 'should set authorizeSuccess to false when an error occurred during authorization', () => { - const error = - 'You need to stay logged in to your WordPress blog while you authorize Jetpack.'; - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_AUTHORIZE_RECEIVE, - error, - } ); - - expect( state ).to.have.property( 'isAuthorizing' ).to.be.false; - expect( state ) - .to.have.property( 'authorizeError' ) - .to.eql( error ); - expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; - expect( state ).to.have.property( 'autoAuthorize' ).to.be.false; - } ); - - test( 'should set authorization code when login is completed', () => { - const code = 'abcd1234efgh5678'; - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_AUTHORIZE_LOGIN_COMPLETE, - data: { - code, - }, - } ); - - expect( state ) - .to.have.property( 'authorizationCode' ) - .to.eql( code ); - } ); - - test( 'should set siteReceived to true and omit some query object properties when received site list', () => { - const state = jetpackConnectAuthorize( - { - queryObject: { - _wp_nonce: 'testnonce', - client_id: 'example.com', - redirect_uri: 'https://example.com/', - scope: 'auth', - secret: 'abcd1234', - site: 'https://example.com/', - state: 1234567890, - }, - }, - { - type: JETPACK_CONNECT_AUTHORIZE_RECEIVE_SITE_LIST, - } - ); - - expect( state ).to.have.property( 'siteReceived' ).to.be.true; - expect( state ).to.have.property( 'isAuthorizing' ).to.be.false; - expect( state ) - .to.have.property( 'queryObject' ) - .to.eql( { - client_id: 'example.com', - redirect_uri: 'https://example.com/', - site: 'https://example.com/', - state: 1234567890, - } ); - } ); - - test( 'should use default authorize state when setting an empty connect query', () => { - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_QUERY_SET, - } ); - - expect( state ) - .to.have.property( 'queryObject' ) - .to.eql( {} ); - expect( state ).to.have.property( 'isAuthorizing' ).to.be.false; - expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; - expect( state ).to.have.property( 'authorizeError' ).to.be.false; - } ); - - test( 'should use new query object over default authorize state when setting a connect query', () => { - const queryObject = { - redirect_uri: 'https://example.wordpress.com', - }; - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_QUERY_SET, - queryObject, - } ); - - expect( state ) - .to.have.property( 'queryObject' ) - .to.eql( queryObject ); - expect( state ).to.have.property( 'isAuthorizing' ).to.be.false; - expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; - expect( state ).to.have.property( 'authorizeError' ).to.be.false; - } ); - - test( 'should set isAuthorizing and autoAuthorize to true when initiating an account creation', () => { - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_CREATE_ACCOUNT, - } ); - - expect( state ).to.have.property( 'isAuthorizing' ).to.be.true; - expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; - expect( state ).to.have.property( 'authorizeError' ).to.be.false; - expect( state ).to.have.property( 'autoAuthorize' ).to.be.true; - } ); - - test( 'should receive userData and bearerToken on successful account creation', () => { - const userData = { - ID: 123, - email: 'example@example.com', - }; - const bearer_token = 'abcd1234'; - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_CREATE_ACCOUNT_RECEIVE, - userData, - data: { - bearer_token, - }, - } ); - - expect( state ).to.have.property( 'isAuthorizing' ).to.be.true; - expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; - expect( state ).to.have.property( 'authorizeError' ).to.be.false; - expect( state ).to.have.property( 'autoAuthorize' ).to.be.true; - expect( state ) - .to.have.property( 'userData' ) - .to.eql( userData ); - expect( state ) - .to.have.property( 'bearerToken' ) - .to.eql( bearer_token ); - } ); - - test( 'should mark authorizeError as true on unsuccessful account creation', () => { - const error = 'Sorry, that username already exists!'; - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_CREATE_ACCOUNT_RECEIVE, - error, - } ); - - expect( state ).to.have.property( 'isAuthorizing' ).to.be.false; - expect( state ).to.have.property( 'authorizeSuccess' ).to.be.false; - expect( state ).to.have.property( 'authorizeError' ).to.be.true; - expect( state ).to.have.property( 'autoAuthorize' ).to.be.false; - } ); - - test( 'should set isRedirectingToWpAdmin to true when an xmlrpc error occurs', () => { - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_REDIRECT_XMLRPC_ERROR_FALLBACK_URL, - } ); - - expect( state ).to.have.property( 'isRedirectingToWpAdmin' ).to.be.true; - } ); - - test( 'should set isRedirectingToWpAdmin to true when a redirect to wp-admin is triggered', () => { - const state = jetpackConnectAuthorize( undefined, { - type: JETPACK_CONNECT_REDIRECT_WP_ADMIN, - } ); - - expect( state ).to.have.property( 'isRedirectingToWpAdmin' ).to.be.true; - } ); - - test( 'should set clientNotResponding when a site request to current client fails', () => { - const state = jetpackConnectAuthorize( - { queryObject: { client_id: '123' } }, - { type: SITE_REQUEST_FAILURE, siteId: 123 } - ); - expect( state ).to.have.property( 'clientNotResponding' ).to.be.true; - } ); - - test( 'should return the given state when a site request fails on a different site', () => { - const originalState = { queryObject: { client_id: '123' } }; - const state = jetpackConnectAuthorize( originalState, { - type: SITE_REQUEST_FAILURE, - siteId: 234, - } ); - expect( state ).to.eql( originalState ); - } ); - - test( 'should return the given state when a site request fails and no client id is set', () => { - const originalState = { queryObject: { jetpack_version: '4.0' } }; - const state = jetpackConnectAuthorize( originalState, { - type: SITE_REQUEST_FAILURE, - siteId: 123, - } ); - expect( state ).to.eql( originalState ); - } ); - - test( 'should return the given state when a site request fails and no query object is set', () => { - const originalState = { isAuthorizing: false }; - const state = jetpackConnectAuthorize( originalState, { - type: SITE_REQUEST_FAILURE, - siteId: 123, - } ); - expect( state ).to.eql( originalState ); - } ); - - test( 'should persist state when a site request to a different client fails', () => { - const state = jetpackConnectAuthorize( - { queryObject: { client_id: '123' } }, - { type: SITE_REQUEST_FAILURE, siteId: 456 } - ); - expect( state ).to.eql( { queryObject: { client_id: '123' } } ); - } ); - - test( 'should persist state', () => { - const originalState = deepFreeze( { - queryObject: { - client_id: 'example.com', - redirect_uri: 'https://example.com/', - }, - timestamp: Date.now(), - } ); - const state = jetpackConnectAuthorize( originalState, { - type: SERIALIZE, - } ); - - expect( state ).to.be.eql( originalState ); - } ); - - test( 'should load valid persisted state', () => { - const originalState = deepFreeze( { - queryObject: { - client_id: 'example.com', - redirect_uri: 'https://example.com/', - }, - timestamp: Date.now(), - } ); - const state = jetpackConnectAuthorize( originalState, { - type: DESERIALIZE, - } ); - - expect( state ).to.be.eql( originalState ); - } ); - - test( 'should not load stale state', () => { - const originalState = deepFreeze( { - queryObject: { - client_id: 'example.com', - redirect_uri: 'https://example.com/', - }, - timestamp: 1, - } ); - const state = jetpackConnectAuthorize( originalState, { - type: DESERIALIZE, - } ); - - expect( state ).to.be.eql( {} ); - } ); - } ); - - describe( '#jetpackSSO()', () => { - test( 'should default to an empty object', () => { - const state = jetpackSSO( undefined, {} ); - expect( state ).to.eql( {} ); - } ); - - test( 'should set isValidating to true when validating', () => { - const state = jetpackSSO( undefined, { - type: JETPACK_CONNECT_SSO_VALIDATION_REQUEST, - } ); - - expect( state ).to.have.property( 'isValidating', true ); - } ); - - test( 'should set isAuthorizing to true when authorizing', () => { - const state = jetpackSSO( undefined, { - type: JETPACK_CONNECT_SSO_AUTHORIZE_REQUEST, - } ); - - expect( state ).to.have.property( 'isAuthorizing', true ); - } ); - - test( 'should set isValidating to false after validation', () => { - const actions = [ - successfulSSOValidation, - { - type: JETPACK_CONNECT_SSO_VALIDATION_ERROR, - error: { - statusCode: 400, - }, - }, - ]; - - actions.forEach( action => { - const state = jetpackSSO( undefined, action ); - expect( state ).to.have.property( 'isValidating', false ); - } ); - } ); - - test( 'should store boolean nonceValid after validation', () => { - const actions = [ successfulSSOValidation, falseSSOValidation ]; - - actions.forEach( action => { - const originalAction = deepFreeze( action ); - const state = jetpackSSO( undefined, originalAction ); - expect( state ).to.have.property( 'nonceValid', originalAction.success ); - } ); - } ); - - test( 'should store blog details after validation', () => { - const successState = jetpackSSO( undefined, successfulSSOValidation ); - expect( successState ) - .to.have.property( 'blogDetails' ) - .to.be.eql( successfulSSOValidation.blogDetails ); - } ); - - test( 'should store shared details after validation', () => { - const successState = jetpackSSO( undefined, successfulSSOValidation ); - expect( successState ) - .to.have.property( 'sharedDetails' ) - .to.be.eql( successfulSSOValidation.sharedDetails ); - } ); - - test( 'should set isAuthorizing to false after authorization', () => { - const actions = [ - { - type: JETPACK_CONNECT_SSO_AUTHORIZE_SUCCESS, - ssoUrl: 'http://example.wordpress.com', - siteUrl: 'http://example.wordpress.com', - }, - { - type: JETPACK_CONNECT_SSO_AUTHORIZE_ERROR, - error: { - statusCode: 400, - }, - }, - ]; - - actions.forEach( action => { - const state = jetpackSSO( undefined, action ); - expect( state ).to.have.property( 'isAuthorizing', false ); - } ); - } ); - - test( 'should store sso_url after authorization', () => { - const action = deepFreeze( { - type: JETPACK_CONNECT_SSO_AUTHORIZE_SUCCESS, - ssoUrl: 'http://example.wordpress.com', - siteUrl: 'http://example.wordpress.com', - } ); - - const state = jetpackSSO( undefined, action ); - - expect( state ).to.have.property( 'ssoUrl', action.ssoUrl ); - } ); - } ); - - describe( '#jetpackAuthAttempts()', () => { - test( 'should default to an empty object', () => { - const state = jetpackAuthAttempts( undefined, {} ); - expect( state ).to.eql( {} ); - } ); - - test( 'should update the timestamp when adding an existent slug with stale timestamp', () => { - const nowTime = Date.now(); - const state = jetpackAuthAttempts( - { 'example.com': { timestamp: 1, attempt: 1 } }, - { - type: JETPACK_CONNECT_RETRY_AUTH, - slug: 'example.com', - attemptNumber: 2, - } - ); - expect( state[ 'example.com' ] ) - .to.have.property( 'timestamp' ) - .to.be.at.least( nowTime ); - } ); - - test( 'should reset the attempt number to 0 when adding an existent slug with stale timestamp', () => { - const state = jetpackAuthAttempts( - { 'example.com': { timestamp: 1, attempt: 1 } }, - { - type: JETPACK_CONNECT_RETRY_AUTH, - slug: 'example.com', - attemptNumber: 2, - } - ); - - expect( state[ 'example.com' ] ) - .to.have.property( 'attempt' ) - .to.equals( 0 ); - } ); - - test( 'should store the attempt number when adding an existent slug with non-stale timestamp', () => { - const state = jetpackAuthAttempts( - { 'example.com': { timestamp: Date.now(), attempt: 1 } }, - { - type: JETPACK_CONNECT_RETRY_AUTH, - slug: 'example.com', - attemptNumber: 2, - } - ); - - expect( state[ 'example.com' ] ) - .to.have.property( 'attempt' ) - .to.equals( 2 ); - } ); - } ); -} ); diff --git a/client/state/jetpack/credentials/actions.js b/client/state/jetpack/credentials/actions.js new file mode 100644 index 0000000000000..8c7eefc3d6932 --- /dev/null +++ b/client/state/jetpack/credentials/actions.js @@ -0,0 +1,24 @@ +/** + * Internal dependencies + */ +import { + JETPACK_CREDENTIALS_AUTOCONFIGURE, + JETPACK_CREDENTIALS_REQUEST, + JETPACK_CREDENTIALS_UPDATE, +} from 'state/action-types'; + +export const requestCredentials = ( siteId ) => ( { + type: JETPACK_CREDENTIALS_REQUEST, + siteId +} ); + +export const updateCredentials = ( siteId, credentials ) => ( { + type: JETPACK_CREDENTIALS_UPDATE, + siteId, + credentials +} ); + +export const autoConfigCredentials = ( siteId ) => ( { + type: JETPACK_CREDENTIALS_AUTOCONFIGURE, + siteId +} ); diff --git a/client/state/jetpack/credentials/reducer.js b/client/state/jetpack/credentials/reducer.js new file mode 100644 index 0000000000000..f5e1d323c919d --- /dev/null +++ b/client/state/jetpack/credentials/reducer.js @@ -0,0 +1,39 @@ +/** @format */ +/** + * Internal dependencies + */ +import { + JETPACK_CREDENTIALS_STORE, + JETPACK_CREDENTIALS_UPDATE, + JETPACK_CREDENTIALS_UPDATE_SUCCESS, + JETPACK_CREDENTIALS_UPDATE_FAILURE, +} from 'state/action-types'; +import { combineReducers, keyedReducer } from 'state/utils'; +import { itemsSchema } from './schema'; + +export const items = keyedReducer( 'siteId', ( state, { type, credentials } ) => { + if ( JETPACK_CREDENTIALS_STORE === type ) { + return 'object' === typeof credentials ? credentials : {}; + } + + return state; +} ); +items.schema = itemsSchema; + +export const updateRequesting = keyedReducer( 'siteId', ( state, { type } ) => { + switch ( type ) { + case JETPACK_CREDENTIALS_UPDATE: + return true; + + case JETPACK_CREDENTIALS_UPDATE_SUCCESS: + case JETPACK_CREDENTIALS_UPDATE_FAILURE: + return false; + } + + return state; +} ); + +export const reducer = combineReducers( { + items, + updateRequesting, +} ); diff --git a/client/state/jetpack/credentials/schema.js b/client/state/jetpack/credentials/schema.js new file mode 100644 index 0000000000000..83521f2475252 --- /dev/null +++ b/client/state/jetpack/credentials/schema.js @@ -0,0 +1,15 @@ +/** @format */ +export const itemsSchema = { + type: 'object', + items: { + type: 'object', + properties: { + abspath: { type: 'string' }, + host: { type: 'string' }, + port: { type: 'number' }, + protocol: { type: 'string' }, + pass: { type: 'boolean' }, + user: { type: 'string' }, + }, + }, +}; diff --git a/client/state/jetpack/reducer.js b/client/state/jetpack/reducer.js index a60e986e456ad..9397296118b10 100644 --- a/client/state/jetpack/reducer.js +++ b/client/state/jetpack/reducer.js @@ -6,12 +6,14 @@ import { reducer as connection } from './connection/reducer'; import { combineReducers } from 'state/utils'; +import { reducer as credentials } from './credentials/reducer'; import { reducer as jumpstart } from './jumpstart/reducer'; import { reducer as modules } from './modules/reducer'; import { reducer as settings } from './settings/reducer'; export default combineReducers( { connection, + credentials, jumpstart, modules, settings, diff --git a/client/state/jitm/actions.js b/client/state/jitm/actions.js new file mode 100644 index 0000000000000..e7a930addffb9 --- /dev/null +++ b/client/state/jitm/actions.js @@ -0,0 +1,44 @@ +/** @format */ +/** + * Internal Dependencies + */ +import { JITM_DISMISS, JITM_SET } from 'state/action-types.js'; + +/** + * Dismisses a jitm + * @param {int} siteId The site id to dismiss the jitm for + * @param {string} id The id of the jitm to dismiss + * @param {string} featureClass The feature class of the jitm to dismiss + * @return {object} The dismiss action + */ +export const dismissJetpackJITM = ( siteId, id, featureClass ) => ( { + type: JITM_DISMISS, + siteId, + id, + featureClass, +} ); + +/** + * Inserts a jitm into the store for display + * @param {int} siteId The site identifier + * @param {string} messagePath The path of the jitm (ex: "calypso:comments:admin_notices") + * @param {object} jitms The objects to display + * @return {object} The jitm insert action + */ +export const insertJITM = ( siteId, messagePath, jitms ) => ( { + type: JITM_SET, + keyedPath: messagePath + siteId, + jitms: jitms.map( jitm => ( { ...jitm, lastUpdated: Date.now() } ) ), +} ); + +/** + * Removes all jitms for a given message path + * @param {int} siteId The site identifier + * @param {string} messagePath The path of the jitm (ex: "calypso:comments:admin_notices") + * @return {object} The action to clear out all the jitms + */ +export const clearJITM = ( siteId, messagePath ) => ( { + type: JITM_SET, + keyedPath: messagePath + siteId, + jitms: [], +} ); diff --git a/client/state/reader/conversations/actions.js b/client/state/reader/conversations/actions.js index be695aab7083c..59f0cd8c0738e 100644 --- a/client/state/reader/conversations/actions.js +++ b/client/state/reader/conversations/actions.js @@ -11,31 +11,31 @@ import { READER_CONVERSATION_UPDATE_FOLLOW_STATUS, } from 'state/action-types'; -export function followConversation( { blogId, postId } ) { +export function followConversation( { siteId, postId } ) { return { type: READER_CONVERSATION_FOLLOW, payload: { - blogId, + siteId, postId, }, }; } -export function muteConversation( { blogId, postId } ) { +export function muteConversation( { siteId, postId } ) { return { type: READER_CONVERSATION_MUTE, payload: { - blogId, + siteId, postId, }, }; } -export function updateConversationFollowStatus( { blogId, postId, followStatus } ) { +export function updateConversationFollowStatus( { siteId, postId, followStatus } ) { return { type: READER_CONVERSATION_UPDATE_FOLLOW_STATUS, payload: { - blogId, + siteId, postId, followStatus, }, diff --git a/client/state/reader/conversations/reducer.js b/client/state/reader/conversations/reducer.js new file mode 100644 index 0000000000000..8f8f114996647 --- /dev/null +++ b/client/state/reader/conversations/reducer.js @@ -0,0 +1,57 @@ +/** @format */ +/** + * External dependencies + */ +import { assign } from 'lodash'; + +/** + * Internal dependencies + */ +import { + READER_CONVERSATION_FOLLOW, + READER_CONVERSATION_MUTE, + READER_CONVERSATION_UPDATE_FOLLOW_STATUS, +} from 'state/action-types'; +import { + CONVERSATION_FOLLOW_STATUS_FOLLOWING, + CONVERSATION_FOLLOW_STATUS_MUTING, +} from './follow-status'; +import { combineReducers, createReducer } from 'state/utils'; +import { itemsSchema } from './schema'; +import { key } from './utils'; + +/** + * Tracks all known conversation following statuses. + */ +export const items = createReducer( + {}, + { + [ READER_CONVERSATION_FOLLOW ]: ( state, action ) => { + const newState = assign( {}, state, { + [ key( + action.payload.siteId, + action.payload.postId + ) ]: CONVERSATION_FOLLOW_STATUS_FOLLOWING, + } ); + return newState; + }, + [ READER_CONVERSATION_MUTE ]: ( state, action ) => { + const newState = assign( {}, state, { + [ key( action.payload.siteId, action.payload.postId ) ]: CONVERSATION_FOLLOW_STATUS_MUTING, + } ); + return newState; + }, + [ READER_CONVERSATION_UPDATE_FOLLOW_STATUS ]: ( state, action ) => { + const newState = assign( {}, state, { + [ key( action.payload.siteId, action.payload.postId ) ]: action.payload.followStatus, + } ); + + return newState; + }, + }, + itemsSchema +); + +export default combineReducers( { + items, +} ); diff --git a/client/state/reader/conversations/schema.js b/client/state/reader/conversations/schema.js new file mode 100644 index 0000000000000..6f65a081e4137 --- /dev/null +++ b/client/state/reader/conversations/schema.js @@ -0,0 +1,26 @@ +/** @format */ + +/** + * Internal dependencies + */ +import { + CONVERSATION_FOLLOW_STATUS_FOLLOWING, + CONVERSATION_FOLLOW_STATUS_NOT_FOLLOWING, + CONVERSATION_FOLLOW_STATUS_MUTING, +} from './follow-status'; + +/* eslint-disable quote-props */ +export const itemsSchema = { + type: 'object', + patternProperties: { + '^[0-9]+-[0-9]+$': { + enum: [ + CONVERSATION_FOLLOW_STATUS_FOLLOWING, + CONVERSATION_FOLLOW_STATUS_NOT_FOLLOWING, + CONVERSATION_FOLLOW_STATUS_MUTING, + ], + }, + }, + additionalProperties: false, +}; +/* eslint-enable quote-props */ diff --git a/client/state/reader/conversations/test/actions.js b/client/state/reader/conversations/test/actions.js index 2d805c6b6a623..25ed79caf6c7d 100644 --- a/client/state/reader/conversations/test/actions.js +++ b/client/state/reader/conversations/test/actions.js @@ -18,20 +18,20 @@ import { CONVERSATION_FOLLOW_STATUS_MUTING } from 'state/reader/conversations/fo describe( 'actions', () => { describe( '#followConversation', () => { test( 'should return an action when a conversation is followed', () => { - const action = followConversation( { blogId: 123, postId: 456 } ); + const action = followConversation( { siteId: 123, postId: 456 } ); expect( action ).toEqual( { type: READER_CONVERSATION_FOLLOW, - payload: { blogId: 123, postId: 456 }, + payload: { siteId: 123, postId: 456 }, } ); } ); } ); describe( '#muteConversation', () => { test( 'should return an action when a conversation is muted', () => { - const action = muteConversation( { blogId: 123, postId: 456 } ); + const action = muteConversation( { siteId: 123, postId: 456 } ); expect( action ).toEqual( { type: READER_CONVERSATION_MUTE, - payload: { blogId: 123, postId: 456 }, + payload: { siteId: 123, postId: 456 }, } ); } ); } ); @@ -39,13 +39,13 @@ describe( 'actions', () => { describe( '#updateConversationFollowStatus', () => { test( 'should return an action when a conversation follow status is updated', () => { const action = updateConversationFollowStatus( { - blogId: 123, + siteId: 123, postId: 456, followStatus: CONVERSATION_FOLLOW_STATUS_MUTING, } ); expect( action ).toEqual( { type: READER_CONVERSATION_UPDATE_FOLLOW_STATUS, - payload: { blogId: 123, postId: 456, followStatus: CONVERSATION_FOLLOW_STATUS_MUTING }, + payload: { siteId: 123, postId: 456, followStatus: CONVERSATION_FOLLOW_STATUS_MUTING }, } ); } ); } ); diff --git a/client/state/reader/conversations/test/reducer.js b/client/state/reader/conversations/test/reducer.js new file mode 100644 index 0000000000000..b787bf93cdc89 --- /dev/null +++ b/client/state/reader/conversations/test/reducer.js @@ -0,0 +1,74 @@ +/** @format */ +/** + * External dependencies + */ +import deepFreeze from 'deep-freeze'; + +/** + * Internal dependencies + */ +import { items } from '../reducer'; +import { + READER_CONVERSATION_FOLLOW, + READER_CONVERSATION_MUTE, + READER_CONVERSATION_UPDATE_FOLLOW_STATUS, + SERIALIZE, + DESERIALIZE, +} from 'state/action-types'; + +describe( 'reducer', () => { + describe( '#items()', () => { + test( 'should default to an empty object', () => { + const state = items( undefined, {} ); + expect( state ).toEqual( {} ); + } ); + + test( 'should update for successful follow', () => { + const original = deepFreeze( {} ); + + const state = items( original, { + type: READER_CONVERSATION_FOLLOW, + payload: { siteId: 123, postId: 456 }, + } ); + + expect( state[ '123-456' ] ).toEqual( 'F' ); + } ); + + test( 'should update for successful mute', () => { + const original = deepFreeze( {} ); + + const state = items( original, { + type: READER_CONVERSATION_MUTE, + payload: { siteId: 123, postId: 456 }, + } ); + + expect( state[ '123-456' ] ).toEqual( 'M' ); + } ); + + test( 'should update when given a valid follow status', () => { + const original = deepFreeze( { '123-456': 'M' } ); + + const state = items( original, { + type: READER_CONVERSATION_UPDATE_FOLLOW_STATUS, + payload: { siteId: 123, postId: 456, followStatus: 'F' }, + } ); + + expect( state[ '123-456' ] ).toEqual( 'F' ); + } ); + + test( 'will deserialize valid state', () => { + const validState = { '123-456': 'M' }; + expect( items( validState, { type: DESERIALIZE } ) ).toEqual( validState ); + } ); + + test( 'will not deserialize invalid state', () => { + const invalidState = { '123-456': 'X' }; + expect( items( invalidState, { type: DESERIALIZE } ) ).toEqual( {} ); + } ); + + test( 'will serialize', () => { + const validState = { '123-456': 'M' }; + expect( items( validState, { type: SERIALIZE } ) ).toEqual( validState ); + } ); + } ); +} ); diff --git a/client/state/reader/conversations/utils.js b/client/state/reader/conversations/utils.js new file mode 100644 index 0000000000000..7fe92b36d7206 --- /dev/null +++ b/client/state/reader/conversations/utils.js @@ -0,0 +1,5 @@ +/** @format */ + +export function key( siteId, postId ) { + return `${ siteId }-${ postId }`; +} diff --git a/client/state/reader/reducer.js b/client/state/reader/reducer.js index e1752bee25743..e4967cd08cf90 100644 --- a/client/state/reader/reducer.js +++ b/client/state/reader/reducer.js @@ -2,31 +2,34 @@ /** * Internal dependencies */ -import lists from './lists/reducer'; import { combineReducers } from 'state/utils'; + +import conversations from './conversations/reducer'; import feeds from './feeds/reducer'; +import feedSearches from './feed-searches/reducer'; import follows from './follows/reducer'; -import sites from './sites/reducer'; +import lists from './lists/reducer'; import posts from './posts/reducer'; +import recommendedSites from './recommended-sites/reducer'; import relatedPosts from './related-posts/reducer'; import siteBlocks from './site-blocks/reducer'; +import sites from './sites/reducer'; import tags from './tags/reducer'; -import thumbnails from './thumbnails/reducer'; import teams from './teams/reducer'; -import feedSearches from './feed-searches/reducer'; -import recommendedSites from './recommended-sites/reducer'; +import thumbnails from './thumbnails/reducer'; export default combineReducers( { + conversations, feeds, + feedSearches, follows, lists, - sites, posts, + recommendedSites, relatedPosts, siteBlocks, + sites, tags, - thumbnails, teams, - feedSearches, - recommendedSites, + thumbnails, } ); diff --git a/client/state/reader/sites/actions.js b/client/state/reader/sites/actions.js index ee237299e1aee..7946afeab1d36 100644 --- a/client/state/reader/sites/actions.js +++ b/client/state/reader/sites/actions.js @@ -52,15 +52,15 @@ export function requestSite( siteId ) { } ); return data; }, - function failure( err ) { + function failure( error ) { dispatch( { type: READER_SITE_REQUEST_FAILURE, payload: { ID: siteId, }, - error: err, + error, } ); - throw err; + throw error; } ); }; diff --git a/client/state/reader/sites/reducer.js b/client/state/reader/sites/reducer.js index 70db75fadbffa..67700162c175f 100644 --- a/client/state/reader/sites/reducer.js +++ b/client/state/reader/sites/reducer.js @@ -45,16 +45,19 @@ function handleDeserialize( state ) { } function handleRequestFailure( state, action ) { + // 410 means site moved. site used to be wpcom but is no longer + if ( action.error && action.error.code !== 410 ) { + return state; + } + // new object proceeds current state to prevent new errors from overwriting existing values - return assign( - { - [ action.payload.ID ]: { - ID: action.payload.ID, - is_error: true, - }, + return assign( {}, state, { + [ action.payload.ID ]: { + ID: action.payload.ID, + is_error: true, + error: action.error, }, - state - ); + } ); } function adaptSite( attributes ) { diff --git a/client/state/reader/sites/test/reducer.js b/client/state/reader/sites/test/reducer.js index de68b02b6c808..cfb36ee1d2162 100644 --- a/client/state/reader/sites/test/reducer.js +++ b/client/state/reader/sites/test/reducer.js @@ -173,17 +173,17 @@ describe( 'reducer', () => { expect( items( validState, { type: DESERIALIZE } ) ).to.deep.equal( validState ); } ); - test( 'should stash an error object in the map if the request fails', () => { + test( 'should stash an error object in the map if the request fails with a 410', () => { expect( items( {}, { type: READER_SITE_REQUEST_FAILURE, - error: new Error( 'request failed' ), + error: { code: 410 }, payload: { ID: 666 }, } ) - ).to.deep.equal( { 666: { ID: 666, is_error: true } } ); + ).to.deep.equal( { 666: { ID: 666, is_error: true, error: { code: 410 } } } ); } ); test( 'should overwrite an existing entry on receiving a new feed', () => { @@ -204,7 +204,7 @@ describe( 'reducer', () => { expect( items( startingState, { type: READER_SITE_REQUEST_FAILURE, - error: new Error( 'request failed' ), + error: { code: 500 }, payload: { ID: 666 }, } ) ).to.deep.equal( startingState ); diff --git a/client/state/reader/watermarks/actions.js b/client/state/reader/watermarks/actions.js new file mode 100644 index 0000000000000..fb9dde895ac74 --- /dev/null +++ b/client/state/reader/watermarks/actions.js @@ -0,0 +1,23 @@ +/** @format */ + +/** + * Internal dependencies + */ +import { READER_VIEW_STREAM } from 'state/action-types'; + +/** + * this is a relatively generic action type for something very specific (marking up the watermark) + * My hope is that we'll be able to reuse this same action-type for many other functionalities. + * i.e. unexpanding all photos/videos when opening a stream. + * + * @param {Date} mark - date last viewed + * @param {String} streamId - stream being viewed + * @returns {Object} action object for dispatch + */ +export const viewStream = ( { mark, streamId } ) => { + return { + type: READER_VIEW_STREAM, + mark, + streamId, + }; +}; diff --git a/client/state/reader/watermarks/reducer.js b/client/state/reader/watermarks/reducer.js new file mode 100644 index 0000000000000..4a7dbe79f0729 --- /dev/null +++ b/client/state/reader/watermarks/reducer.js @@ -0,0 +1,27 @@ +/** @format */ + +/** + * External Dependencies + */ +import { max } from 'lodash'; + +/** + * Internal dependencies + */ +import { READER_VIEW_STREAM, DESERIALIZE } from 'state/action-types'; +import { createReducer, keyedReducer } from 'state/utils'; +import schema from './watermark-schema'; + +export const watermarks = keyedReducer( + 'streamId', + createReducer( + {}, + { + [ READER_VIEW_STREAM ]: ( state, action ) => max( [ +state, +action.mark ] ), + }, + schema + ), + [ DESERIALIZE ] +); + +watermarks.hasCustomPersistence = true; diff --git a/client/state/reader/watermarks/test/reducer.js b/client/state/reader/watermarks/test/reducer.js new file mode 100644 index 0000000000000..88b01bb9bdd85 --- /dev/null +++ b/client/state/reader/watermarks/test/reducer.js @@ -0,0 +1,57 @@ +/** @format */ + +/** + * Internal dependencies + */ +import { viewStream } from '../actions'; +import { watermarks } from '../reducer'; +import { DESERIALIZE, SERIALIZE } from 'state/action-types'; + +const streamId = 'special-chicken-stream'; +const mark = Date.now(); + +describe( '#watermarks', () => { + test( 'defaults to empty object', () => { + expect( watermarks( undefined, { type: 'INIT' } ) ).toEqual( {} ); + } ); + + test( 'can add a new stream to empty state', () => { + const action = viewStream( { streamId, mark } ); + expect( watermarks( {}, action ) ).toEqual( { + [ streamId ]: mark, + } ); + } ); + + test( 'can update an existing stream', () => { + const prevState = { [ streamId ]: mark }; + const newMark = mark + 2; + const action = viewStream( { streamId, mark: newMark } ); + expect( watermarks( prevState, action ) ).toEqual( { + [ streamId ]: newMark, + } ); + } ); + + test( 'will reject an attempt to update to an older mark', () => { + const prevState = { [ streamId ]: mark }; + const newMark = mark - 2; + const action = viewStream( { streamId, mark: newMark } ); + expect( watermarks( prevState, action ) ).toEqual( { + [ streamId ]: mark, + } ); + } ); + + test( 'will skip deserializing invalid marks', () => { + const invalidState = { [ streamId ]: 'invalid' }; + expect( watermarks( invalidState, { type: DESERIALIZE } ) ).toEqual( {} ); + } ); + + test( 'will deserialize valid mark', () => { + const validState = { [ streamId ]: 42 }; + expect( watermarks( validState, { type: DESERIALIZE } ) ).toEqual( validState ); + } ); + + test( 'will serialize', () => { + const validState = { [ streamId ]: 42 }; + expect( watermarks( validState, { type: SERIALIZE } ) ).toEqual( validState ); + } ); +} ); diff --git a/client/state/reader/watermarks/watermark-schema.js b/client/state/reader/watermarks/watermark-schema.js new file mode 100644 index 0000000000000..0b435c88a48db --- /dev/null +++ b/client/state/reader/watermarks/watermark-schema.js @@ -0,0 +1,6 @@ +/** @format */ + +export default { + type: 'number', + additionalProperties: false, +}; diff --git a/client/state/selectors/get-credentials-auto-config-status.js b/client/state/selectors/get-credentials-auto-config-status.js new file mode 100644 index 0000000000000..40ec16445407d --- /dev/null +++ b/client/state/selectors/get-credentials-auto-config-status.js @@ -0,0 +1,8 @@ +/** + * External Dependencies + */ +import { get } from 'lodash'; + +export default function getCredentialsAutoConfigStatus( state, siteId ) { + return get( state, [ 'jetpack', 'credentials', 'items', siteId, 'main' ], false ) ? 'requesting' : 'success'; +} diff --git a/client/state/selectors/get-current-user-payment-methods.js b/client/state/selectors/get-current-user-payment-methods.js index c981001ec5831..b5465db3b4925 100644 --- a/client/state/selectors/get-current-user-payment-methods.js +++ b/client/state/selectors/get-current-user-payment-methods.js @@ -29,6 +29,7 @@ const paymentMethods = { byCountry: { US: DEFAULT_PAYMENT_METHODS, + NL: [ 'credit-card', 'ideal', 'paypal' ], }, byWpcomLang: {}, diff --git a/client/state/selectors/get-jetpack-connect-redirect-after-auth.js b/client/state/selectors/get-jetpack-connect-redirect-after-auth.js new file mode 100644 index 0000000000000..e9a900ca48ca2 --- /dev/null +++ b/client/state/selectors/get-jetpack-connect-redirect-after-auth.js @@ -0,0 +1,20 @@ +/** @format */ +/** + * External dependencies + */ +import { get } from 'lodash'; + +/** + * Internal dependencies + */ +import { getAuthorizationRemoteQueryData } from 'state/jetpack-connect/selectors'; + +/** + * Returns redirect_after_auth provided as part of Jetpack Connect authorization. + * + * @param {Object} state Global state tree + * @return {?String} Redirect URL + */ +export default function getJetpackConnectRedirectAfterAuth( state ) { + return get( getAuthorizationRemoteQueryData( state ), 'redirect_after_auth', null ); +} diff --git a/client/state/selectors/get-jetpack-credentials.js b/client/state/selectors/get-jetpack-credentials.js new file mode 100644 index 0000000000000..c5886dbd492da --- /dev/null +++ b/client/state/selectors/get-jetpack-credentials.js @@ -0,0 +1,8 @@ +/** + * External Dependencies + */ +import { get } from 'lodash'; + +export default function getJetpackCredentials( state, siteId, role ) { + return get( state, [ 'jetpack', 'credentials', 'items', siteId, role ], {} ); +} diff --git a/client/state/selectors/get-reader-follows.js b/client/state/selectors/get-reader-follows.js index b2c49a0b84660..6d3c1c79b5b4c 100644 --- a/client/state/selectors/get-reader-follows.js +++ b/client/state/selectors/get-reader-follows.js @@ -1,3 +1,4 @@ +/** @format */ /** * External dependencies * @@ -21,13 +22,24 @@ import { getFeed } from 'state/reader/feeds/selectors'; */ const getReaderFollows = createSelector( state => { + // remove subs where the sub has an error const items = reject( values( state.reader.follows.items ), 'error' ); + // this is important. don't mutate the original items. - return items.map( item => ( { + const withSiteAndFeed = items.map( item => ( { ...item, site: getSite( state, item.blog_ID ), feed: getFeed( state, item.feed_ID ), } ) ); + + // remove subs where the feed or site has an error + const withoutErrors = reject( + withSiteAndFeed, + item => + ( item.site && item.site.is_error && item.site.error.code === 410 ) || + ( item.feed && item.feed.is_error ) + ); + return withoutErrors; }, state => [ state.reader.follows.items, diff --git a/client/state/selectors/get-reader-watermark.js b/client/state/selectors/get-reader-watermark.js new file mode 100644 index 0000000000000..dcb73b821815a --- /dev/null +++ b/client/state/selectors/get-reader-watermark.js @@ -0,0 +1,12 @@ +/** @format */ + +/** + * Get the high watermark for a Reader stream + * + * @param {Object} state - + * @param {String} streamId - + * @returns {Number} date in number form + */ +const getReaderWatermark = ( state, streamId ) => state.reader.watermarks[ streamId ]; + +export default getReaderWatermark; diff --git a/client/state/selectors/has-main-credentials.js b/client/state/selectors/has-main-credentials.js new file mode 100644 index 0000000000000..db611418f3c36 --- /dev/null +++ b/client/state/selectors/has-main-credentials.js @@ -0,0 +1,8 @@ +/** + * External Dependencies + */ +import { get } from 'lodash'; + +export default function hasMainCredentials( state, siteId ) { + return !! get( state, [ 'jetpack', 'credentials', 'items', siteId, 'main' ], false ); +} diff --git a/client/state/selectors/index.js b/client/state/selectors/index.js index 7d2ae3a73f7b6..f03e7a476ddda 100644 --- a/client/state/selectors/index.js +++ b/client/state/selectors/index.js @@ -37,12 +37,15 @@ export getBlockedSites from './get-blocked-sites'; export getBlogStickers from './get-blog-stickers'; export getContactDetailsCache from './get-contact-details-cache'; export getContactDetailsExtraCache from './get-contact-details-extra-cache'; +export getCredentialsAutoConfigStatus from './get-credentials-auto-config-status'; export getCurrentLocaleSlug from './get-current-locale-slug'; export getCurrentPlanPurchaseId from './get-current-plan-purchase-id'; export getCurrentUserPaymentMethods from './get-current-user-payment-methods'; export getImageEditorIsGreaterThanMinimumDimensions from './get-image-editor-is-greater-than-minimum-dimensions'; export getImageEditorOriginalAspectRatio from './get-image-editor-original-aspect-ratio'; export getJetpackConnectionStatus from './get-jetpack-connection-status'; +export getJetpackConnectRedirectAfterAuth from './get-jetpack-connect-redirect-after-auth'; +export getJetpackCredentials from './get-jetpack-credentials'; export getJetpackJumpstartStatus from './get-jetpack-jumpstart-status'; export getJetpackModule from './get-jetpack-module'; export getJetpackModules from './get-jetpack-modules'; @@ -100,6 +103,7 @@ export getReaderRecommendedSites from './get-reader-recommended-sites'; export getReaderRecommendedSitesPagingOffset from './get-reader-recommended-sites-paging-offset'; export getReaderTags from './get-reader-tags'; export getReaderTeams from './get-reader-teams'; +export getReaderWatermark from './get-reader-watermark'; export getRegistrantWhois from './get-registrant-whois'; export getRequestedRewind from './get-requested-rewind'; export getRestoreError from './get-restore-error'; @@ -159,6 +163,7 @@ export hasBrokenSiteUserConnection from './has-broken-site-user-connection'; export hasInitializedSites from './has-initialized-sites'; export hasJetpackSites from './has-jetpack-sites'; export hasSitePendingAutomatedTransfer from './has-site-pending-automated-transfer'; +export hasMainCredentials from './has-main-credentials'; export hasUnsavedUserSettings from './has-unsaved-user-settings'; export hasUserAskedADirectlyQuestion from './has-user-asked-a-directly-question'; export hasUserSettings from './has-user-settings'; @@ -193,6 +198,7 @@ export isFetchingMagicLoginEmail from './is-fetching-magic-login-email'; export isFetchingPublicizeShareActionsPublished from './is-fetching-publicize-share-actions-published'; export isFetchingPublicizeShareActionsScheduled from './is-fetching-publicize-share-actions-scheduled'; export isFollowing from './is-following'; +export isFollowingReaderConversation from './is-following-reader-conversation'; export isHiddenSite from './is-hidden-site'; export isJetpackModuleActive from './is-jetpack-module-active'; export isJetpackModuleUnavailableInDevelopmentMode from './is-jetpack-module-unavailable-in-development-mode'; @@ -242,12 +248,14 @@ export isSiteAutomatedTransfer from './is-site-automated-transfer'; export isSiteBlocked from './is-site-blocked'; export isSiteOnFreePlan from './is-site-on-free-plan'; export isSiteOnPaidPlan from './is-site-on-paid-plan'; +export isSitePressable from './is-site-pressable'; export isSiteSupportingImageEditor from './is-site-supporting-image-editor'; export isSiteUpgradeable from './is-site-upgradeable'; export isTracking from './is-tracking'; export isTransientMedia from './is-transient-media'; export isTwoStepEnabled from './is-two-step-enabled'; export isTwoStepSmsEnabled from './is-two-step-sms-enabled'; +export isUpdatingJetpackCredentials from './is-updating-jetpack-credentials'; export isUpdatingJetpackSettings from './is-updating-jetpack-settings'; export isUpdatingSiteMonitorSettings from './is-updating-site-monitor-settings'; export isUserRegistrationDaysWithinRange from './is-user-registration-days-within-range'; diff --git a/client/state/selectors/is-following-reader-conversation.js b/client/state/selectors/is-following-reader-conversation.js new file mode 100644 index 0000000000000..b33fcb9965620 --- /dev/null +++ b/client/state/selectors/is-following-reader-conversation.js @@ -0,0 +1,28 @@ +/* + * @format + */ + +/** + * External dependencies + */ +import { get } from 'lodash'; + +/** + * Internal dependencies + */ +import { key } from 'state/reader/conversations/utils'; +import { CONVERSATION_FOLLOW_STATUS_FOLLOWING } from 'state/reader/conversations/follow-status'; + +/* + * Get the conversation following status for a given post + * + * @param {Object} state Global state tree + * @param {Object} params Params including siteId and postId + * @return {Boolean} Is the user following this conversation? + */ +export default function isFollowingReaderConversation( state, { siteId, postId } ) { + return ( + get( state, [ 'reader', 'conversations', 'items', key( siteId, postId ) ] ) === + CONVERSATION_FOLLOW_STATUS_FOLLOWING + ); +} diff --git a/client/state/selectors/is-site-pressable.js b/client/state/selectors/is-site-pressable.js new file mode 100644 index 0000000000000..7b4a4649e6af9 --- /dev/null +++ b/client/state/selectors/is-site-pressable.js @@ -0,0 +1,8 @@ +/** + * External Dependencies + */ +import { get } from 'lodash'; + +export default function isSitePressable( state, siteId ) { + return get( state.activityLog.rewindStatus, [ siteId, 'isPressable' ], null ); +} diff --git a/client/state/selectors/is-updating-jetpack-credentials.js b/client/state/selectors/is-updating-jetpack-credentials.js new file mode 100644 index 0000000000000..5410ee94d0f21 --- /dev/null +++ b/client/state/selectors/is-updating-jetpack-credentials.js @@ -0,0 +1,8 @@ +/** + * External Dependencies + */ +import { get } from 'lodash'; + +export default function isUpdatingJetpackCredentials( state, siteId ) { + return get( state, [ 'jetpack', 'credentials', 'updateRequesting', siteId ], false ); +} diff --git a/client/state/selectors/test/is-following-reader-conversation.js b/client/state/selectors/test/is-following-reader-conversation.js new file mode 100644 index 0000000000000..299e4c1e04d81 --- /dev/null +++ b/client/state/selectors/test/is-following-reader-conversation.js @@ -0,0 +1,50 @@ +/** @format */ + +/** + * Internal dependencies + */ +import { isFollowingReaderConversation } from '../'; + +describe( 'isFollowingReaderConversation()', () => { + test( 'should return true for a known followed post', () => { + const prevState = { + reader: { + conversations: { + items: { + '123-456': 'F', + }, + }, + }, + }; + const nextState = isFollowingReaderConversation( prevState, { siteId: 123, postId: 456 } ); + expect( nextState ).toEqual( true ); + } ); + + test( 'should return false for a muted post', () => { + const prevState = { + reader: { + conversations: { + items: { + '123-456': 'M', + }, + }, + }, + }; + const nextState = isFollowingReaderConversation( prevState, { siteId: 123, postId: 456 } ); + expect( nextState ).toEqual( false ); + } ); + + test( 'should return false for an unknown post', () => { + const prevState = { + reader: { + conversations: { + items: { + '123-456': 'F', + }, + }, + }, + }; + const nextState = isFollowingReaderConversation( prevState, { siteId: 234, postId: 456 } ); + expect( nextState ).toEqual( false ); + } ); +} ); diff --git a/client/state/sites/actions.js b/client/state/sites/actions.js index 1bdd411d70097..4720bacc1711a 100644 --- a/client/state/sites/actions.js +++ b/client/state/sites/actions.js @@ -103,7 +103,7 @@ export function requestSites() { fields: 'ID,URL,name,capabilities,jetpack,visible,is_private,is_vip,icon,plan,jetpack_modules,single_user_site,is_multisite,options', //eslint-disable-line max-len options: - 'is_mapped_domain,unmapped_url,admin_url,is_redirect,is_automated_transfer,allowed_file_types,show_on_front,main_network_site,jetpack_version,software_version,default_post_format,created_at,frame_nonce,publicize_permanently_disabled,page_on_front,page_for_posts,advanced_seo_front_page_description,advanced_seo_title_formats,verification_services_codes,podcasting_archive,is_domain_only,default_sharing_status,default_likes_enabled,wordads,upgraded_filetypes_enabled,videopress_enabled,permalink_structure,gmt_offset,signup_is_store,has_pending_automated_transfer', //eslint-disable-line max-len + 'is_mapped_domain,unmapped_url,admin_url,is_redirect,is_automated_transfer,allowed_file_types,show_on_front,main_network_site,jetpack_version,software_version,default_post_format,created_at,frame_nonce,publicize_permanently_disabled,page_on_front,page_for_posts,advanced_seo_front_page_description,advanced_seo_title_formats,verification_services_codes,podcasting_archive,is_domain_only,default_sharing_status,default_likes_enabled,wordads,upgraded_filetypes_enabled,videopress_enabled,permalink_structure,gmt_offset,is_wpcom_store,signup_is_store,has_pending_automated_transfer', //eslint-disable-line max-len } ) .then( response => { dispatch( receiveSites( response.sites ) ); diff --git a/client/state/test/utils.js b/client/state/test/utils.js index 7261ee2fb9e95..3c5cbbe985551 100644 --- a/client/state/test/utils.js +++ b/client/state/test/utils.js @@ -306,6 +306,14 @@ describe( 'utils', () => { } ); } ); + test( 'should handle keyNames referencing nested keys', () => { + const keyed = keyedReducer( 'person.name', age ); + const action = { type: 'GROW', person: { name: 'Calypso' } }; + expect( keyed( undefined, action ) ).to.eql( { + Calypso: 1, + } ); + } ); + test( 'should only affect the keyed item in a collection', () => { const keyed = keyedReducer( 'name', age ); expect( keyed( prevState, grow( 'Calypso' ) ) ).to.eql( { diff --git a/client/state/themes/actions.js b/client/state/themes/actions.js index 8cc7ea9708de8..92757a88ceb2a 100644 --- a/client/state/themes/actions.js +++ b/client/state/themes/actions.js @@ -11,6 +11,7 @@ import page from 'page'; /** * Internal dependencies */ +import { isExternal } from 'lib/url'; import wpcom from 'lib/wp'; import wporg from 'lib/wporg'; import { @@ -550,6 +551,11 @@ export function installAndTryAndCustomizeTheme( themeId, siteId ) { */ export function tryAndCustomizeTheme( themeId, siteId ) { return ( dispatch, getState ) => { + const url = getThemeCustomizeUrl( getState(), themeId, siteId ); + if ( isExternal( url ) ) { + window.location.href = url; + return; + } page( getThemeCustomizeUrl( getState(), themeId, siteId ) ); }; } diff --git a/client/state/utils.js b/client/state/utils.js index cecb0ef3ef81b..2e73dc57fcdd3 100644 --- a/client/state/utils.js +++ b/client/state/utils.js @@ -7,6 +7,7 @@ import validator from 'is-my-json-valid'; import { flow, + get, includes, isEqual, mapValues, @@ -92,7 +93,7 @@ export function isValidStateWithSchema( state, schema ) { * * // now every item can decide what to do for persistence * - * @param {String} keyName name of key in action referencing item in state map + * @param {string} keyName lodash-style path to the key in action referencing item in state map * @param {Function} reducer applied to referenced item in state map * @param {Array} globalActions set of types which apply to every item in the collection * @return {Function} super-reducer applying reducer over map of keyed items @@ -128,12 +129,7 @@ export const keyedReducer = ( keyName, reducer, globalActions ) => { } // don't allow coercion of key name: null => 0 - if ( ! action.hasOwnProperty( keyName ) ) { - return state; - } - - // the action must refer to some item in the map - const itemKey = action[ keyName ]; + const itemKey = get( action, keyName, undefined ); // if the action doesn't contain a valid reference // then return without any updates diff --git a/config/desktop.json b/config/desktop.json index c414009abc70f..66a66f41404b2 100644 --- a/config/desktop.json +++ b/config/desktop.json @@ -22,6 +22,7 @@ "catch-js-errors": false, "code-splitting": false, "comments/management": true, + "comments/management/jetpack-5.5": false, "comments/management/sorting": false, "desktop": true, "desktop-promo": false, diff --git a/config/development.json b/config/development.json index 7c307dd8e5f36..a25279d43af0b 100644 --- a/config/development.json +++ b/config/development.json @@ -43,6 +43,8 @@ "comments/moderation-tools-in-posts": true, "comments/management": true, "comments/management/comment-view": true, + "comments/management/jetpack-5.5": false, + "comments/management/m3-design": false, "comments/management/post-view": true, "comments/management/quick-actions": true, "comments/management/sorting": true, @@ -64,6 +66,7 @@ "jetpack/activity-log": true, "jetpack/activity-log/rewind": true, "jetpack/api-cache": true, + "jetpack/credentials": true, "jetpack/happychat": true, "jetpack/google-analytics-anonymize-ip": true, "jetpack/google-analytics-for-stores": true, @@ -145,6 +148,7 @@ "reader/recommendations/posts": true, "reader/related-posts": true, "reader/search": true, + "reader/high-watermark": true, "reader/tags-with-elasticsearch": false, "resume-editing": true, "republicize": true, @@ -157,7 +161,7 @@ "signup/domain-first-flow": true, "signup/social": true, "signup/social-management": true, - "signup/atomic-store-flow": true, + "signup/atomic-store-flow": false, "signup/wpcc": true, "simple-payments": true, "standalone-site-preview": true, @@ -172,6 +176,7 @@ "upgrades/credit-cards": true, "upgrades/domain-search": true, "upgrades/in-app-purchase": false, + "upgrades/netherlands-ideal": true, "upgrades/paypal": true, "upgrades/premium-themes": true, "upgrades/removal-survey": true, diff --git a/config/horizon.json b/config/horizon.json index 5a1b1bc7ad562..863ef7cf24f53 100644 --- a/config/horizon.json +++ b/config/horizon.json @@ -24,6 +24,7 @@ "catch-js-errors": true, "code-splitting": true, "comments/management": true, + "comments/management/jetpack-5.5": false, "comments/management/sorting": true, "devdocs": false, "domains/cctlds": true, @@ -37,7 +38,7 @@ "jetpack/api-cache": true, "jetpack/happychat": true, "jetpack_core_inline_update": true, - "jitms": false, + "jitms": true, "keyboard-shortcuts": true, "login/native-login-links": true, "login/wp-login": true, @@ -101,7 +102,7 @@ "signup/domain-first-flow": true, "signup/social": true, "signup/social-management": true, - "signup/atomic-store-flow": true, + "signup/atomic-store-flow": false, "signup/wpcc": true, "simple-payments": true, "standalone-site-preview": true, @@ -111,6 +112,7 @@ "upgrades/checkout": true, "upgrades/credit-cards": true, "upgrades/in-app-purchase": false, + "upgrades/netherlands-ideal": true, "upgrades/paypal": true, "upgrades/premium-themes": true, "upgrades/removal-survey": true, diff --git a/config/production.json b/config/production.json index 53e34713cb821..5bc310da8b2bb 100644 --- a/config/production.json +++ b/config/production.json @@ -23,6 +23,7 @@ "catch-js-errors": true, "code-splitting": true, "comments/management": true, + "comments/management/jetpack-5.5": false, "comments/management/sorting": false, "desktop-promo": true, "domains/cctlds": true, @@ -117,6 +118,7 @@ "upgrades/credit-cards": true, "upgrades/domain-search": true, "upgrades/in-app-purchase": false, + "upgrades/netherlands-ideal": true, "upgrades/paypal": true, "upgrades/premium-themes": true, "upgrades/removal-survey": true, @@ -130,11 +132,12 @@ "woocommerce/extension-promotions": false, "woocommerce/extension-reviews": true, "woocommerce/extension-settings": true, - "woocommerce/extension-settings-email": false, + "woocommerce/extension-settings-email": true, "woocommerce/extension-settings-payments": true, "woocommerce/extension-settings-shipping": true, - "woocommerce/extension-settings-stripe-connect-flows": false, + "woocommerce/extension-settings-stripe-connect-flows": true, "woocommerce/extension-settings-tax": true, + "woocommerce/extension-wcservices": true, "wpcom-user-bootstrap": true }, "rtl": false, diff --git a/config/stage.json b/config/stage.json index c6daf587ac946..43d2513c6cf1c 100644 --- a/config/stage.json +++ b/config/stage.json @@ -25,6 +25,7 @@ "catch-js-errors": true, "code-splitting": true, "comments/management": true, + "comments/management/jetpack-5.5": false, "comments/management/sorting": false, "desktop-promo": true, "domains/cctlds": true, @@ -37,11 +38,12 @@ "jetpack/activity-log": true, "jetpack/activity-log/rewind": true, "jetpack/api-cache": true, + "jetpack/credentials": true, "jetpack/happychat": true, "jetpack/google-analytics-anonymize-ip": true, "jetpack/google-analytics-for-stores": true, "jetpack_core_inline_update": true, - "jitms": false, + "jitms": true, "login/magic-login": true, "login/native-login-links": true, "login/wp-login": true, @@ -63,6 +65,7 @@ "manage/security": true, "manage/site-settings/analytics": true, "manage/site-settings/categories": true, + "manage/site-settings/disconnect-flow": true, "manage/stats": true, "manage/themes": true, "manage/themes-jetpack": true, @@ -122,6 +125,7 @@ "upgrades/credit-cards": true, "upgrades/domain-search": true, "upgrades/in-app-purchase": false, + "upgrades/netherlands-ideal": true, "upgrades/paypal": true, "upgrades/premium-themes": true, "upgrades/removal-survey": true, @@ -138,7 +142,7 @@ "woocommerce/extension-settings-email": true, "woocommerce/extension-settings-payments": true, "woocommerce/extension-settings-shipping": true, - "woocommerce/extension-settings-stripe-connect-flows": false, + "woocommerce/extension-settings-stripe-connect-flows": true, "woocommerce/extension-settings-tax": true, "woocommerce/extension-wcservices": true, "woocommerce/store-on-non-atomic-sites": true, diff --git a/config/wpcalypso.json b/config/wpcalypso.json index 97d89ea495212..a671a4b3252ef 100644 --- a/config/wpcalypso.json +++ b/config/wpcalypso.json @@ -19,6 +19,7 @@ "automated-transfer": true, "apple-pay": true, "comments/management": true, + "comments/management/jetpack-5.5": false, "comments/management/quick-actions": true, "comments/management/sorting": true, "catch-js-errors": true, @@ -42,7 +43,7 @@ "jetpack/google-analytics-anonymize-ip": true, "jetpack/google-analytics-for-stores": true, "jetpack_core_inline_update": true, - "jitms": false, + "jitms": true, "login/magic-login": true, "login/native-login-links": true, "login/wp-login": true, @@ -109,6 +110,7 @@ "reader/recommendations/posts": true, "reader/related-posts": true, "reader/search": true, + "reader/high-watermark": true, "reader/tags-with-elasticsearch": false, "resume-editing": true, "republicize": true, @@ -121,7 +123,7 @@ "signup/domain-first-flow": true, "signup/social": true, "signup/social-management": true, - "signup/atomic-store-flow": true, + "signup/atomic-store-flow": false, "signup/wpcc": true, "simple-payments": true, "standalone-site-preview": true, @@ -137,6 +139,7 @@ "upgrades/domain-search": true, "upgrades/in-app-purchase": false, "upgrades/paypal": true, + "upgrades/netherlands-ideal": true, "upgrades/premium-themes": true, "upgrades/removal-survey": true, "upgrades/precancellation-chat": true, @@ -152,7 +155,7 @@ "woocommerce/extension-settings-email": true, "woocommerce/extension-settings-payments": true, "woocommerce/extension-settings-shipping": true, - "woocommerce/extension-settings-stripe-connect-flows": false, + "woocommerce/extension-settings-stripe-connect-flows": true, "woocommerce/extension-settings-tax": true, "woocommerce/extension-wcservices": true, "woocommerce/store-on-non-atomic-sites": true, diff --git a/lintout.tmp b/lintout.tmp new file mode 100644 index 0000000000000..aa39e62ccc188 --- /dev/null +++ b/lintout.tmp @@ -0,0 +1,16648 @@ +The react/jsx-space-before-closing rule is deprecated. Please use the react/jsx-tag-spacing rule with the "beforeSelfClosing" option instead. + +/Users/seear/repos/wp-calypso/client/account-recovery/error-screen/index.js + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/account-recovery/reset-code-validation/index.js + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/auth/controller.js + 69:5 error Identifier 'response_type' is not in camel case camelcase + 70:5 error Identifier 'client_id' is not in camel case camelcase + 71:5 error Identifier 'client_secret' is not in camel case camelcase + 78:55 error Identifier 'blog_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/blocks/app-banner/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/blocks/daily-post-button/helper.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:2 error Identifier 'dp_prompt' is not in camel case camelcase + 11:2 error Identifier 'dp_photo_challenge' is not in camel case camelcase + 12:2 error Identifier 'dp_discover' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/blocks/daily-post-button/test/fixtures/index.js + 5:2 error Identifier 'site_ID' is not in camel case camelcase + 10:2 error Identifier 'site_ID' is not in camel case camelcase + 15:2 error Identifier 'site_ID' is not in camel case camelcase + 24:2 error Identifier 'short_url' is not in camel case camelcase + 28:2 error Identifier 'site_ID' is not in camel case camelcase + 33:2 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/blocks/daily-post-button/test/helper.js + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/blocks/image-editor/test/utils.js + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/blocks/image-editor/utils.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/blocks/sharing-preview-pane/utils.js + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/blocks/stats-navigation/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/blocks/stats-navigation/index.js + 20:1 error 'state/selectors' import is duplicated no-duplicate-imports + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/boot/common.js + 179:1 error Line 179 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/boot/polyfills.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/boot/project/wordpress-com.js + 98:5 error Identifier 'user_id' is not in camel case camelcase + 99:5 error Identifier 'calypso_env' is not in camel case camelcase + 104:6 error Identifier 'blog_id' is not in camel case camelcase + 105:6 error Identifier 'calypso_section' is not in camel case camelcase + 114:1 error Line 114 exceeds the maximum line length of 100 max-len + 170:28 error Identifier 'newdash_pageviews' is not in camel case camelcase + 198:1 error Line 198 exceeds the maximum line length of 100 max-len + 249:1 error Line 249 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/bulk-select/test/index.js + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 89:1 error Line 89 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/button/test/index.js + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/data/media-list-data/test/utils.js + 17:4 error Unexpected var, use let or const instead no-var + 23:4 error Unexpected var, use let or const instead no-var + 29:4 error Unexpected var, use let or const instead no-var + 35:4 error Unexpected var, use let or const instead no-var + 41:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/components/data/media-list-data/utils.js + 3:2 error Missing JSDoc @returns for function valid-jsdoc + 11:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/components/data/query-rewind-restore-status/index.js + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/data/query-simple-payments/index.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/domains/registrant-extra-info/fr-validate-contact-details.js + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/domains/registrant-extra-info/test/fr-validate-contact-details.js + 145:1 error Line 145 exceeds the maximum line length of 100 max-len + 154:1 error Line 154 exceeds the maximum line length of 100 max-len + 164:1 error Line 164 exceeds the maximum line length of 100 max-len + 187:1 error Line 187 exceeds the maximum line length of 100 max-len + 196:1 error Line 196 exceeds the maximum line length of 100 max-len + 206:1 error Line 206 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/email-verification/index.js + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 37:1 error Expected indentation of 6 tabs but found 7 indent + 38:1 error Expected indentation of 5 tabs but found 6 indent + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/forms/form-phone-input/test/mocks/mock-countries-list-empty.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/forms/form-phone-input/test/mocks/mock-countries-list.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:5 error Identifier 'numeric_code' is not in camel case camelcase + 16:5 error Identifier 'country_name' is not in camel case camelcase + 21:5 error Identifier 'numeric_code' is not in camel case camelcase + 22:5 error Identifier 'country_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/components/happychat/autoscroll.js + 16:8 error Identifier '_autoscroll_enabled' is not in camel case camelcase + 35:8 error Identifier '_autoscroll_node' is not in camel case camelcase + 44:2 error Identifier '_autoscroll_stop_listening' is not in camel case camelcase + 62:2 error Identifier '_autoscroll_detectScroll' is not in camel case camelcase + 70:9 error Identifier '_autoscroll_enabled' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/components/happychat/functional.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/happychat/scrollbleed.js + 3:1 error Line 3 exceeds the maximum line length of 100 max-len + 6:1 error Line 6 exceeds the maximum line length of 100 max-len + 18:8 error Identifier '_scrollbleed_node' is not in camel case camelcase + 21:2 error Identifier '_scrollbleed_handleScroll' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/components/image/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/infinite-list/scroll-helper.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 425:1 error Line 425 exceeds the maximum line length of 100 max-len + 442:1 error Line 442 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/infinite-list/test/scroll-helper.js + 21:4 error Unexpected var, use let or const instead no-var + 46:4 error Unexpected var, use let or const instead no-var + 72:3 error Unexpected var, use let or const instead no-var + 103:3 error Unexpected var, use let or const instead no-var + 126:4 error Unexpected var, use let or const instead no-var + 138:4 error Unexpected var, use let or const instead no-var + 193:4 error Unexpected var, use let or const instead no-var + 231:4 error Unexpected var, use let or const instead no-var + 243:4 error Unexpected var, use let or const instead no-var + 289:4 error Unexpected var, use let or const instead no-var + 317:4 error Unexpected var, use let or const instead no-var + 340:4 error Unexpected var, use let or const instead no-var + 352:4 error Unexpected var, use let or const instead no-var + 412:4 error Unexpected var, use let or const instead no-var + 443:4 error Unexpected var, use let or const instead no-var + 455:4 error Unexpected var, use let or const instead no-var + 502:4 error Unexpected var, use let or const instead no-var + 535:4 error Unexpected var, use let or const instead no-var + 567:4 error Unexpected var, use let or const instead no-var + 592:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/components/list-end/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/marketing-survey/cancel-purchase-form/enrichedSurveyData.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/marketing-survey/cancel-purchase-form/initialSurveyState.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + +/Users/seear/repos/wp-calypso/client/components/marketing-survey/cancel-purchase-form/isSurveyFilledIn.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'survey' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/components/marketing-survey/cancel-purchase-form/nextStep.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'currentStep' valid-jsdoc + 1:1 error Missing JSDoc for parameter 'steps' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/components/marketing-survey/cancel-purchase-form/previousStep.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'currentStep' valid-jsdoc + 1:1 error Missing JSDoc for parameter 'steps' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/components/marketing-survey/cancel-purchase-form/stepsForProductAndSurvey.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/marketing-survey/cancel-purchase-form/test/enrichedSurveyData.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 32:2 error Test title is used multiple times in the same test suite jest/no-identical-title + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 51:15 error Identifier 'created_at' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/components/marketing-survey/cancel-purchase-form/test/isSurveyFilledIn.js + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/marketing-survey/cancel-purchase-form/test/stepsForProductAndSurvey.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 39:22 error Identifier 'product_slug' is not in camel case camelcase + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 46:22 error Identifier 'product_slug' is not in camel case camelcase + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 51:22 error Identifier 'product_slug' is not in camel case camelcase + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 58:22 error Identifier 'product_slug' is not in camel case camelcase + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 63:22 error Identifier 'product_slug' is not in camel case camelcase + 70:22 error Identifier 'product_slug' is not in camel case camelcase + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 79:22 error Identifier 'product_slug' is not in camel case camelcase + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + 87:22 error Identifier 'product_slug' is not in camel case camelcase + 89:1 error Line 89 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 93:22 error Identifier 'product_slug' is not in camel case camelcase + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 101:22 error Identifier 'product_slug' is not in camel case camelcase + 103:1 error Line 103 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 107:22 error Identifier 'product_slug' is not in camel case camelcase + 114:1 error Line 114 exceeds the maximum line length of 100 max-len + 115:22 error Identifier 'product_slug' is not in camel case camelcase + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/phone-input/phone-number.js + 93:1 error Line 93 exceeds the maximum line length of 100 max-len + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + 136:1 error Line 136 exceeds the maximum line length of 100 max-len + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + 160:1 error Line 160 exceeds the maximum line length of 100 max-len + 164:1 error Line 164 exceeds the maximum line length of 100 max-len + 165:1 error Line 165 exceeds the maximum line length of 100 max-len + 169:1 error Line 169 exceeds the maximum line length of 100 max-len + 179:1 error Line 179 exceeds the maximum line length of 100 max-len + 192:1 error Line 192 exceeds the maximum line length of 100 max-len + 195:1 error Line 195 exceeds the maximum line length of 100 max-len + 196:1 error Line 196 exceeds the maximum line length of 100 max-len + 200:1 error Line 200 exceeds the maximum line length of 100 max-len + 203:1 error Line 203 exceeds the maximum line length of 100 max-len + 221:1 error Line 221 exceeds the maximum line length of 100 max-len + 237:1 error Line 237 exceeds the maximum line length of 100 max-len + 246:1 error Line 246 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/phone-input/test/test-phone-number.js + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 270:1 error Line 270 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/popover/util.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 139:1 error Expected indentation of 3 tabs but found 4 indent + 140:1 error Expected indentation of 3 tabs but found 4 indent + 141:1 error Expected indentation of 3 tabs but found 4 indent + 142:1 error Expected indentation of 4 tabs but found 5 indent + 143:1 error Expected indentation of 4 tabs but found 5 indent + 144:1 error Expected indentation of 2 tabs but found 3 indent + 146:1 error Expected indentation of 3 tabs but found 4 indent + 147:1 error Expected indentation of 3 tabs but found 4 indent + 148:1 error Expected indentation of 4 tabs but found 5 indent + 149:1 error Expected indentation of 4 tabs but found 5 indent + 150:1 error Expected indentation of 3 tabs but found 4 indent + 151:1 error Expected indentation of 4 tabs but found 5 indent + 152:1 error Expected indentation of 4 tabs but found 5 indent + 153:1 error Expected indentation of 2 tabs but found 3 indent + +/Users/seear/repos/wp-calypso/client/components/post-format/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/post-schedule/test/index.js + 57:9 error Identifier 'NowAtUTC3_30' is not in camel case camelcase + 58:11 error Identifier 'NowAtUTC3_30' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/components/post-schedule/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/rating/test/index.js + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/reader-infinite-stream/index.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 50:52 error Identifier 'ui_position' is not in camel case camelcase + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 107:1 error Line 107 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/screen-reader-text/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/search-sites/index.js + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/select-dropdown/test/index.js + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + 97:1 error Line 97 exceeds the maximum line length of 100 max-len + 256:1 error Line 256 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/select-dropdown/test/item.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/seo/helpers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/seo/meta-title-editor/test/index.js + 78:7 error Identifier 'front_page' is not in camel case camelcase + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + 103:1 error Line 103 exceeds the maximum line length of 100 max-len + 111:6 error Identifier 'front_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/components/seo/reader-preview/index.js + 24:6 error Identifier 'better_excerpt' is not in camel case camelcase + 25:19 error Identifier 'canonical_media' is not in camel case camelcase + 26:36 error Identifier 'display_type' is not in camel case camelcase + 28:47 error Identifier 'has_avatar' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/components/share/google-plus-share-preview/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/share/helpers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/signup-site-title/index.js + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/site-title-example/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/sites-dropdown/test/index.js + 102:3 warning Disabled test jest/no-disabled-tests + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/social-buttons/facebook.js + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/social-buttons/google.js + 90:7 error Identifier 'client_id' is not in camel case camelcase + 92:7 error Identifier 'fetch_basic_profile' is not in camel case camelcase + 93:7 error Identifier 'ux_mode' is not in camel case camelcase + 94:7 error Identifier 'redirect_uri' is not in camel case camelcase + 107:1 error Line 107 exceeds the maximum line length of 100 max-len + 149:1 error Line 149 exceeds the maximum line length of 100 max-len + 155:6 error Identifier 'social_account_type' is not in camel case camelcase + 156:6 error Identifier 'error_code' is not in camel case camelcase + 201:1 error Line 201 exceeds the maximum line length of 100 max-len + 212:1 error Line 212 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/i18n.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/after-the-deadline/core.js + 19:7 error Identifier 'ignore_types' is not in camel case camelcase + 33:7 error Identifier 'ignore_strings' is not in camel case camelcase + 45:2 error Unexpected var, use let or const instead no-var + 57:2 error Unexpected var, use let or const instead no-var + 57:6 error Identifier 'show_types' is not in camel case camelcase + 59:3 error Identifier 'ignore_types' is not in camel case camelcase + 83:4 error Identifier 'ignore_types' is not in camel case camelcase + 87:7 error Identifier 'ignore_types' is not in camel case camelcase + 87:22 error Identifier 'ignore_types' is not in camel case camelcase + 94:41 error Identifier 'error_s' is not in camel case camelcase + 95:2 error Unexpected var, use let or const instead no-var + 97:18 error Identifier 'error_s' is not in camel case camelcase + 100:27 error Identifier 'error_s' is not in camel case camelcase + 102:12 error Identifier 'error_s' is not in camel case camelcase + 102:32 error Identifier 'error_s' is not in camel case camelcase + 104:26 error Identifier 'error_s' is not in camel case camelcase + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 105:39 error Identifier 'error_s' is not in camel case camelcase + 105:56 error Identifier 'error_s' is not in camel case camelcase + 106:34 error Identifier 'error_s' is not in camel case camelcase + 107:39 error Identifier 'error_s' is not in camel case camelcase + 107:59 error Identifier 'error_s' is not in camel case camelcase + 109:39 error Identifier 'error_s' is not in camel case camelcase + 109:56 error Identifier 'error_s' is not in camel case camelcase + 118:2 error Unexpected var, use let or const instead no-var + 121:3 error Unexpected var, use let or const instead no-var + 122:3 error Unexpected var, use let or const instead no-var + 123:3 error Unexpected var, use let or const instead no-var + 148:2 error Unexpected var, use let or const instead no-var + 149:2 error Unexpected var, use let or const instead no-var + 158:2 error Unexpected var, use let or const instead no-var + 160:2 error Unexpected var, use let or const instead no-var + 171:2 error Unexpected var, use let or const instead no-var + 210:1 error Line 210 exceeds the maximum line length of 100 max-len + 214:1 error Line 214 exceeds the maximum line length of 100 max-len + 219:1 error Line 219 exceeds the maximum line length of 100 max-len + 270:1 error Line 270 exceeds the maximum line length of 100 max-len + 307:2 error Unexpected var, use let or const instead no-var + 337:2 error Unexpected var, use let or const instead no-var + 378:2 error Unexpected var, use let or const instead no-var + 391:43 error Identifier 'container_nodes' is not in camel case camelcase + 392:2 error Unexpected var, use let or const instead no-var + 414:3 error Unexpected var, use let or const instead no-var + 454:3 error Unexpected var, use let or const instead no-var + 507:1 error Line 507 exceeds the maximum line length of 100 max-len + 537:1 error Line 537 exceeds the maximum line length of 100 max-len + 538:1 error Line 538 exceeds the maximum line length of 100 max-len + 541:7 error Unexpected var, use let or const instead no-var + 546:1 error Line 546 exceeds the maximum line length of 100 max-len + 547:1 error Line 547 exceeds the maximum line length of 100 max-len + 555:1 error Line 555 exceeds the maximum line length of 100 max-len + 561:1 error Line 561 exceeds the maximum line length of 100 max-len + 570:1 error Line 570 exceeds the maximum line length of 100 max-len + 587:1 error Line 587 exceeds the maximum line length of 100 max-len + 601:1 error Line 601 exceeds the maximum line length of 100 max-len + 609:1 error Line 609 exceeds the maximum line length of 100 max-len + 628:2 error Unexpected var, use let or const instead no-var + 636:2 error Unexpected var, use let or const instead no-var + 637:2 error Unexpected var, use let or const instead no-var + 640:3 error Unexpected var, use let or const instead no-var + 682:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/after-the-deadline/plugin.js + 44:2 error Unexpected var, use let or const instead no-var + 84:8 error 'pos' is never reassigned. Use 'const' instead prefer-const + 85:8 error 'targetPos' is never reassigned. Use 'const' instead prefer-const + 89:1 error Line 89 exceeds the maximum line length of 100 max-len + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + 129:35 error Identifier 'old_node' is not in camel case camelcase + 129:45 error Identifier 'new_node' is not in camel case camelcase + 133:30 error Identifier 'node_html' is not in camel case camelcase + 134:33 error Unquoted reserved word 'class' used as key quote-props + 152:1 error Line 152 exceeds the maximum line length of 100 max-len + 163:1 error Line 163 exceeds the maximum line length of 100 max-len + 181:6 error Unexpected var, use let or const instead no-var + 198:3 error Unexpected var, use let or const instead no-var + 260:7 error 'ignores' is never reassigned. Use 'const' instead prefer-const + 270:3 error Unexpected var, use let or const instead no-var + 276:1 error Line 276 exceeds the maximum line length of 100 max-len + 309:1 error Line 309 exceeds the maximum line length of 100 max-len + 322:1 error Line 322 exceeds the maximum line length of 100 max-len + 362:4 error Unexpected var, use let or const instead no-var + 396:1 error Line 396 exceeds the maximum line length of 100 max-len + 408:1 error Line 408 exceeds the maximum line length of 100 max-len + 469:8 error 'ignores' is never reassigned. Use 'const' instead prefer-const + 497:4 error Unexpected var, use let or const instead no-var + 506:1 error Line 506 exceeds the maximum line length of 100 max-len + 509:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/contact-form/dialog/locales.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/contact-form/dialog/validations.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/contact-form/shortcode-utils.js + 21:8 error 'fieldShortcode' is never reassigned. Use 'const' instead prefer-const + 52:8 error 'fields' is never reassigned. Use 'const' instead prefer-const + 58:10 error 'field' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/contact-form/test/shortcode.js + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 111:1 error Line 111 exceeds the maximum line length of 100 max-len + 123:1 error Line 123 exceeds the maximum line length of 100 max-len + 157:1 error Line 157 exceeds the maximum line length of 100 max-len + 167:1 error Line 167 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/contact-form/test/validations.js + 127:1 error Line 127 exceeds the maximum line length of 100 max-len + 131:1 error Line 131 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/editor-button-analytics/plugin.js + 60:2 error Missing JSDoc for parameter 'event' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/embed/plugin.js + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/embed/test/dialog.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/markdown/plugin.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/media/restrict-size/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/media/restrict-size/test/index.js + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + 93:1 error Line 93 exceeds the maximum line length of 100 max-len + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 111:1 error Line 111 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/touch-scroll-toolbar/plugin.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 49:12 error 'elements' is never reassigned. Use 'const' instead prefer-const + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpcom-autoresize/plugin.js + 18:2 error Unexpected var, use let or const instead no-var + 31:3 error Unexpected var, use let or const instead no-var + 52:3 error Unexpected var, use let or const instead no-var + 172:11 error Identifier 'autoresize_min_height' is not in camel case camelcase + 178:11 error Identifier 'autoresize_max_height' is not in camel case camelcase + 182:3 error Unexpected var, use let or const instead no-var + 216:1 error Line 216 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpcom-charmap/plugin.js + 17:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpcom-help/plugin.js + 17:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpcom-sourcecode/plugin.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpcom-sourcecode/test/plugin.js + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpcom-tabindex/plugin.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpcom-track-paste/plugin.js + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpcom-view/plugin.js + 34:2 error Unexpected var, use let or const instead no-var + 56:3 error Unexpected var, use let or const instead no-var + 63:4 error Unexpected var, use let or const instead no-var + 156:3 error Unexpected var, use let or const instead no-var + 167:3 error Unexpected var, use let or const instead no-var + 201:3 error Unexpected var, use let or const instead no-var + 223:6 error Unquoted reserved word 'class' used as key quote-props + 251:3 error Unexpected var, use let or const instead no-var + 274:1 error Line 274 exceeds the maximum line length of 100 max-len + 277:1 error Line 277 exceeds the maximum line length of 100 max-len + 281:3 error Unexpected var, use let or const instead no-var + 309:3 error Unexpected var, use let or const instead no-var + 328:1 error Line 328 exceeds the maximum line length of 100 max-len + 329:1 error Line 329 exceeds the maximum line length of 100 max-len + 349:3 error Unexpected var, use let or const instead no-var + 354:1 error Line 354 exceeds the maximum line length of 100 max-len + 358:1 error Line 358 exceeds the maximum line length of 100 max-len + 374:3 error Unexpected var, use let or const instead no-var + 398:65 error 'view' is already declared in the upper scope no-shadow + 399:5 error Unexpected var, use let or const instead no-var + 421:3 error Unexpected var, use let or const instead no-var + 428:4 error Unexpected var, use let or const instead no-var + 460:5 error Unexpected var, use let or const instead no-var + 475:1 error Line 475 exceeds the maximum line length of 100 max-len + 547:1 error Line 547 exceeds the maximum line length of 100 max-len + 570:3 error Unexpected var, use let or const instead no-var + 582:1 error Line 582 exceeds the maximum line length of 100 max-len + 588:1 error Line 588 exceeds the maximum line length of 100 max-len + 751:1 error Line 751 exceeds the maximum line length of 100 max-len + 777:3 error Unexpected var, use let or const instead no-var + 797:3 error Unexpected var, use let or const instead no-var + 798:4 error 'views' is already declared in the upper scope no-shadow + 808:34 error 'view' is already declared in the upper scope no-shadow + 819:1 error Line 819 exceeds the maximum line length of 100 max-len + 856:3 error Unexpected var, use let or const instead no-var + 871:3 error Unexpected var, use let or const instead no-var + 913:6 error Unexpected var, use let or const instead no-var + 925:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpcom-view/views/video/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpeditimage/plugin.js + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 155:1 error Line 155 exceeds the maximum line length of 100 max-len + 212:1 error Line 212 exceeds the maximum line length of 100 max-len + 213:1 error Line 213 exceeds the maximum line length of 100 max-len + 244:1 error Line 244 exceeds the maximum line length of 100 max-len + 271:1 error Line 271 exceeds the maximum line length of 100 max-len + 294:64 error Identifier 'forced_root_block' is not in camel case camelcase + 414:1 error Line 414 exceeds the maximum line length of 100 max-len + 452:35 error Unquoted reserved word 'class' used as key quote-props + 484:1 error Line 484 exceeds the maximum line length of 100 max-len + 489:1 error Line 489 exceeds the maximum line length of 100 max-len + 528:35 error Unquoted reserved word 'class' used as key quote-props + 599:1 error Line 599 exceeds the maximum line length of 100 max-len + 602:1 error Line 602 exceeds the maximum line length of 100 max-len + 643:1 error Line 643 exceeds the maximum line length of 100 max-len + 646:1 error Line 646 exceeds the maximum line length of 100 max-len + 781:1 error Line 781 exceeds the maximum line length of 100 max-len + 793:1 error Line 793 exceeds the maximum line length of 100 max-len + 794:1 error Line 794 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wpemoji/plugin.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wplink/plugin.js + 150:1 error Line 150 exceeds the maximum line length of 100 max-len + 157:1 error Line 157 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/tinymce/plugins/wptextpattern/plugin.js + 27:2 error Unexpected var, use let or const instead no-var + 29:2 error Unexpected var, use let or const instead no-var + 34:2 error Unexpected var, use let or const instead no-var + 44:2 error Unexpected var, use let or const instead no-var + 46:2 error Unexpected var, use let or const instead no-var + 47:2 error Unexpected var, use let or const instead no-var + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 88:3 error Unexpected var, use let or const instead no-var + 89:3 error Unexpected var, use let or const instead no-var + 90:3 error Unexpected var, use let or const instead no-var + 91:3 error Unexpected var, use let or const instead no-var + 92:3 error Unexpected var, use let or const instead no-var + 93:3 error Unexpected var, use let or const instead no-var + 94:3 error Unexpected var, use let or const instead no-var + 95:3 error Unexpected var, use let or const instead no-var + 105:23 error 'node' is already declared in the upper scope no-shadow + 106:4 error Unexpected var, use let or const instead no-var + 107:4 error Unexpected var, use let or const instead no-var + 107:8 error 'offset' is already declared in the upper scope no-shadow + 162:6 error Unexpected var, use let or const instead no-var + 162:10 error 'offset' is already declared in the upper scope no-shadow + 177:3 error Unexpected var, use let or const instead no-var + 209:3 error Unexpected var, use let or const instead no-var + 222:4 error Unexpected var, use let or const instead no-var + 251:3 error Unexpected var, use let or const instead no-var + 293:1 error Line 293 exceeds the maximum line length of 100 max-len + 298:1 error Line 298 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/title-format-editor/parser.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 120:1 error Missing JSDoc return type valid-jsdoc + 192:1 error Line 192 exceeds the maximum line length of 100 max-len + 194:1 error Line 194 exceeds the maximum line length of 100 max-len + 196:1 error Line 196 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/update-post-status/index.js + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/components/update-post-status/update-template.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:9 error className should follow CSS namespace guidelines (expected update-post-status__ prefix) wpcalypso/jsx-classname-namespace + 12:9 error className should follow CSS namespace guidelines (expected update-post-status__ prefix) wpcalypso/jsx-classname-namespace + 13:9 error className should follow CSS namespace guidelines (expected update-post-status__ prefix) wpcalypso/jsx-classname-namespace + 42:8 error className should follow CSS namespace guidelines (expected update-post-status__ prefix) wpcalypso/jsx-classname-namespace + 83:43 error className should follow CSS namespace guidelines (expected update-post-status__ prefix or to be in one of index.js, index.jsx, main.js, main.jsx) wpcalypso/jsx-classname-namespace + 85:10 error className should follow CSS namespace guidelines (expected update-post-status__ prefix) wpcalypso/jsx-classname-namespace + 86:12 error className should follow CSS namespace guidelines (expected update-post-status__ prefix) wpcalypso/jsx-classname-namespace + +/Users/seear/repos/wp-calypso/client/config/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 30:4 error Unexpected console statement no-console + +/Users/seear/repos/wp-calypso/client/controller/index.web.js + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/controller/shared.js + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/devdocs/controller.js + 187:1 error Line 187 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/devdocs/docs-example/util.js + 23:10 error Unexpected console statement no-console + 32:10 error Unexpected console statement no-console + 43:10 error Unexpected console statement no-console + +/Users/seear/repos/wp-calypso/client/devdocs/service.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/dispatcher/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/hello-dolly/hello-dolly-page.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/hello-dolly/state/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/hello-dolly/state/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/dashboard/index.js + 155:1 error Line 155 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/dashboard/manage-no-orders-view.js + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/dashboard/manage-orders-view.js + 54:4 error Identifier 'display_name' is not in camel case camelcase + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + 151:1 error Line 151 exceeds the maximum line length of 100 max-len + 165:1 error Line 165 exceeds the maximum line length of 100 max-len + 170:1 error Line 170 exceeds the maximum line length of 100 max-len + 175:1 error Line 175 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/dashboard/pre-setup-view.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/dashboard/required-pages-setup-view.js + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/dashboard/required-plugins-install-view.js + 431:1 error Line 431 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/dashboard/setup-header.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/dashboard/setup-task.js + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/dashboard/setup-tasks.js + 165:1 error Line 165 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/index.js + 20:1 error 'state/selectors' import is duplicated no-duplicate-imports + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/index.js + 33:1 error 'woocommerce/state/sites/orders/actions' import is duplicated no-duplicate-imports + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-activity-log/day.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-activity-log/event.js + 20:3 error Identifier 'customer_note' is not in camel case camelcase + 21:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-activity-log/new-note.js + 53:4 error Identifier 'customer_note' is not in camel case camelcase + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-create/customer-card.js + 80:32 error Identifier 'first_name' is not in camel case camelcase + 83:32 error Identifier 'last_name' is not in camel case camelcase + 89:32 error Identifier 'address_1' is not in camel case camelcase + 92:32 error Identifier 'address_2' is not in camel case camelcase + 103:33 error Identifier 'first_name' is not in camel case camelcase + 106:33 error Identifier 'last_name' is not in camel case camelcase + 109:33 error Identifier 'address_1' is not in camel case camelcase + 112:33 error Identifier 'address_2' is not in camel case camelcase + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + 157:1 error Line 157 exceeds the maximum line length of 100 max-len + 233:1 error Line 233 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-create/index.js + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-created/index.js + 13:4 error Identifier 'date_created_gmt' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-customer/dialog.js + 33:4 error Identifier 'address_1' is not in camel case camelcase + 34:4 error Identifier 'address_2' is not in camel case camelcase + 40:4 error Identifier 'first_name' is not in camel case camelcase + 41:4 error Identifier 'last_name' is not in camel case camelcase + 59:4 error Identifier 'first_name' is not in camel case camelcase + 60:4 error Identifier 'last_name' is not in camel case camelcase + 161:1 error Line 161 exceeds the maximum line length of 100 max-len + 195:1 error Line 195 exceeds the maximum line length of 100 max-len + 199:1 error Line 199 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-details/fee-dialog.js + 84:5 error Identifier 'fee_lines' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-details/index.js + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-details/table.js + 45:4 error Identifier 'discount_total' is not in camel case camelcase + 46:4 error Identifier 'line_items' is not in camel case camelcase + 48:4 error Identifier 'shipping_total' is not in camel case camelcase + 114:26 error Identifier 'line_items' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-fulfillment/index.js + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + 97:1 error Line 97 exceeds the maximum line length of 100 max-len + 100:4 error Identifier 'customer_note' is not in camel case camelcase + 223:1 error Line 223 exceeds the maximum line length of 100 max-len + 257:1 error Line 257 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-payment/dialog.js + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + 119:11 error Identifier 'line_item' is not in camel case camelcase + 120:12 error Identifier 'line_item' is not in camel case camelcase + 124:31 error Identifier 'line_item' is not in camel case camelcase + 129:52 error Identifier 'line_item' is not in camel case camelcase + 172:4 error Identifier 'api_refund' is not in camel case camelcase + 190:1 error Line 190 exceeds the maximum line length of 100 max-len + 240:1 error Line 240 exceeds the maximum line length of 100 max-len + 241:1 error Line 241 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-payment/index.js + 27:4 error Identifier 'payment_method_title' is not in camel case camelcase + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/order/order-payment/table.js + 36:4 error Identifier 'discount_total' is not in camel case camelcase + 37:4 error Identifier 'line_items' is not in camel case camelcase + 39:4 error Identifier 'shipping_total' is not in camel case camelcase + 89:1 error Line 89 exceeds the maximum line length of 100 max-len + 124:1 error Line 124 exceeds the maximum line length of 100 max-len + 130:1 error Line 130 exceeds the maximum line length of 100 max-len + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + 149:1 error Line 149 exceeds the maximum line length of 100 max-len + 150:1 error Line 150 exceeds the maximum line length of 100 max-len + 190:1 error Line 190 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/orders/orders-filter-nav.js + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/orders/orders-list.js + 207:1 error Line 207 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/index.js + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 143:70 error Identifier 'per_page' is not in camel case camelcase + 145:72 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-create.js + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + 114:1 error Line 114 exceeds the maximum line length of 100 max-len + 177:1 error Line 177 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-form-additional-details-card.js + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 156:1 error Line 156 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-form-categories-card.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-form-details-card.js + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-form-simple-card.js + 38:35 error Identifier 'regular_price' is not in camel case camelcase + 42:7 error Identifier 'stock_quantity' is not in camel case camelcase + 43:7 error Identifier 'manage_stock' is not in camel case camelcase + 45:4 error Identifier 'stock_quantity' is not in camel case camelcase + 46:4 error Identifier 'manage_stock' is not in camel case camelcase + 48:4 error Identifier 'stock_quantity' is not in camel case camelcase + 49:4 error Identifier 'manage_stock' is not in camel case camelcase + 51:35 error Identifier 'manage_stock' is not in camel case camelcase + 51:35 error Identifier 'manage_stock' is not in camel case camelcase + 51:49 error Identifier 'stock_quantity' is not in camel case camelcase + 51:49 error Identifier 'stock_quantity' is not in camel case camelcase + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + 99:10 error Identifier 'stock_quantity' is not in camel case camelcase + 100:48 error Identifier 'stock_quantity' is not in camel case camelcase + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 131:1 error Line 131 exceeds the maximum line length of 100 max-len + 154:3 error Identifier 'regular_price' is not in camel case camelcase + 155:3 error Identifier 'manage_stock' is not in camel case camelcase + 156:3 error Identifier 'stock_quantity' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-form-variations-card.js + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-form-variations-modal.js + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-form-variations-row.js + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 54:55 error Identifier 'regular_price' is not in camel case camelcase + 70:9 error Identifier 'stock_quantity' is not in camel case camelcase + 71:9 error Identifier 'manage_stock' is not in camel case camelcase + 71:24 error Identifier 'stock_quantity' is not in camel case camelcase + 72:55 error Identifier 'stock_quantity' is not in camel case camelcase + 72:55 error Identifier 'stock_quantity' is not in camel case camelcase + 72:71 error Identifier 'manage_stock' is not in camel case camelcase + 72:71 error Identifier 'manage_stock' is not in camel case camelcase + 226:1 error Line 226 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-form-variations-table.js + 37:4 error Identifier 'regular_price' is not in camel case camelcase + 40:4 error Identifier 'stock_quantity' is not in camel case camelcase + 41:4 error Identifier 'manage_stock' is not in camel case camelcase + 65:9 error Identifier 'stock_quantity' is not in camel case camelcase + 66:9 error Identifier 'manage_stock' is not in camel case camelcase + 66:24 error Identifier 'stock_quantity' is not in camel case camelcase + 134:11 error Identifier 'regular_price' is not in camel case camelcase + 134:46 error Identifier 'stock_quantity' is not in camel case camelcase + 145:16 error Identifier 'stock_quantity' is not in camel case camelcase + 155:15 error Identifier 'regular_price' is not in camel case camelcase + 194:1 error Line 194 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-form.js + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-update.js + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 184:1 error Line 184 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/product-variation-types-form.js + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 143:1 error Line 143 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/products-list-row.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 67:3 error Identifier 'manage_stock' is not in camel case camelcase + 68:3 error Identifier 'stock_quantity' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/products-list-search-results.js + 92:25 error Identifier 'per_page' is not in camel case camelcase + 101:27 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/products/products-list.js + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 88:73 error Identifier 'per_page' is not in camel case camelcase + 93:52 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/promotions/promotion-create.js + 109:1 error Line 109 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/promotions/promotion-header.js + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/promotions/promotion-models.js + 86:2 error Identifier 'product_sale' is not in camel case camelcase + 87:2 error Identifier 'fixed_product' is not in camel case camelcase + 88:2 error Identifier 'fixed_cart' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/promotions/promotions-list-table.js + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/reviews/gravatar.js + 34:3 error Identifier 'avatar_URL' is not in camel case camelcase + 35:3 error Identifier 'display_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/reviews/review-actions-bar.js + 63:1 error Expected indentation of 5 tabs but found 4 indent + 64:1 error Expected indentation of 6 tabs but found 5 indent + 65:1 error Expected indentation of 6 tabs but found 5 indent + 66:1 error Expected indentation of 6 tabs but found 5 indent + 67:1 error Expected indentation of 5 tabs but found 4 indent + 68:1 error Expected indentation of 6 tabs but found 5 indent + 69:1 error Expected indentation of 6 tabs but found 5 indent + 70:1 error Expected indentation of 5 tabs but found 4 indent + 71:1 error Expected indentation of 4 tabs but found 3 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/reviews/review-card.js + 35:4 error Identifier 'avatar_urls' is not in camel case camelcase + 40:4 error Identifier 'date_created_gmt' is not in camel case camelcase + 99:1 error Line 99 exceeds the maximum line length of 100 max-len + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + 124:1 error Line 124 exceeds the maximum line length of 100 max-len + 145:1 error Line 145 exceeds the maximum line length of 100 max-len + 157:1 error Line 157 exceeds the maximum line length of 100 max-len + 158:1 error Line 158 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/reviews/review-replies.js + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 71:46 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/reviews/review-reply-create.js + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 147:1 error Line 147 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/reviews/review-reply.js + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + 141:1 error Line 141 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/reviews/reviews-filter-nav.js + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/email/index.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/email/mailchimp/getting-started.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/email/mailchimp/index.js + 15:1 error 'state/plugins/installed/selectors' import is duplicated no-duplicate-imports + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 23:41 error Block must not be padded by blank lines padded-blocks + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 92:1 error Expected indentation of 6 tabs but found 7 indent + 93:1 error Expected indentation of 6 tabs but found 7 indent + 94:1 error Expected indentation of 6 tabs but found 7 indent + 95:1 error Expected indentation of 6 tabs but found 7 indent + 96:1 error Expected indentation of 5 tabs but found 6 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/email/mailchimp/mailchimp_dashboard.js + 28:1 error Expected indentation of 0 tabs but found 1 indent + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 30:1 error 'woocommerce/state/sites/settings/email/selectors' import is duplicated no-duplicate-imports + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 34:10 error Identifier 'account_name' is not in camel case camelcase + 34:24 error Identifier 'store_syncing' is not in camel case camelcase + 34:39 error Identifier 'product_count' is not in camel case camelcase + 34:54 error Identifier 'mailchimp_total_products' is not in camel case camelcase + 35:3 error Identifier 'mailchimp_total_orders' is not in camel case camelcase + 35:27 error Identifier 'order_count' is not in camel case camelcase + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 36:41 error Identifier 'product_count' is not in camel case camelcase + 36:76 error Identifier 'mailchimp_total_products' is not in camel case camelcase + 37:38 error Identifier 'product_count' is not in camel case camelcase + 37:60 error Identifier 'mailchimp_total_products' is not in camel case camelcase + 38:40 error Identifier 'order_count' is not in camel case camelcase + 38:73 error Identifier 'mailchimp_total_orders' is not in camel case camelcase + 39:35 error Identifier 'order_count' is not in camel case camelcase + 39:55 error Identifier 'mailchimp_total_orders' is not in camel case camelcase + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 51:7 error Identifier 'div_name' is not in camel case camelcase + 52:7 error Identifier 'div_info' is not in camel case camelcase + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + 70:7 error Identifier 'div_name' is not in camel case camelcase + 71:7 error Identifier 'div_info' is not in camel case camelcase + 87:5 error Identifier 'store_syncing' is not in camel case camelcase + 94:10 error Identifier 'store_syncing' is not in camel case camelcase + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 102:7 error Identifier 'span_info' is not in camel case camelcase + 106:7 error Identifier 'account_name' is not in camel case camelcase + 106:7 error Identifier 'account_name' is not in camel case camelcase + 119:7 error Identifier 'span_info' is not in camel case camelcase + 128:7 error Identifier 'span_info' is not in camel case camelcase + 151:15 error Identifier 'mailchimp_checkbox_defaults' is not in camel case camelcase + 155:15 error Identifier 'newsletter_label' is not in camel case camelcase + 163:15 error Identifier 'mailchimp_checkbox_defaults' is not in camel case camelcase + 179:1 error Line 179 exceeds the maximum line length of 100 max-len + 192:1 error Line 192 exceeds the maximum line length of 100 max-len + 204:1 error Line 204 exceeds the maximum line length of 100 max-len + 207:1 error Expected indentation of 6 tabs but found 7 indent + 207:1 error Line 207 exceeds the maximum line length of 100 max-len + 208:1 error Expected indentation of 6 tabs but found 7 indent + 209:1 error Expected indentation of 5 tabs but found 6 indent + 224:50 error Block must not be padded by blank lines padded-blocks + 238:1 error Line 238 exceeds the maximum line length of 100 max-len + 256:4 error Identifier 'mailchimp_list' is not in camel case camelcase + 257:4 error Identifier 'newsletter_label' is not in camel case camelcase + 258:4 error Identifier 'mailchimp_auto_subscribe' is not in camel case camelcase + 259:4 error Identifier 'mailchimp_checkbox_defaults' is not in camel case camelcase + 260:4 error Identifier 'mailchimp_checkbox_action' is not in camel case camelcase + 274:1 error Line 274 exceeds the maximum line length of 100 max-len + 282:1 error Line 282 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/email/mailchimp/setup-mailchimp.js + 24:1 error Expected indentation of 0 tabs but found 1 indent + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 64:1 error Expected indentation of 1 tab but found 2 indent + 66:46 error Block must not be padded by blank lines padded-blocks + 74:4 error Identifier 'settings_values_missing' is not in camel case camelcase + 75:4 error Identifier 'input_field_has_changed' is not in camel case camelcase + 76:4 error Identifier 'api_key_input' is not in camel case camelcase + 86:11 error Identifier 'active_tab' is not in camel case camelcase + 87:46 error Identifier 'active_tab' is not in camel case camelcase + 89:9 error Identifier 'active_tab' is not in camel case camelcase + 93:28 error Identifier 'active_tab' is not in camel case camelcase + 95:28 error Identifier 'active_tab' is not in camel case camelcase + 97:9 error Identifier 'active_tab' is not in camel case camelcase + 105:27 error Identifier 'active_tab' is not in camel case camelcase + 112:15 error Identifier 'campaign_from_name' is not in camel case camelcase + 113:1 error Line 113 exceeds the maximum line length of 100 max-len + 113:15 error Identifier 'campaign_from_email' is not in camel case camelcase + 114:15 error Identifier 'campaign_subject' is not in camel case camelcase + 115:15 error Identifier 'store_locale' is not in camel case camelcase + 116:15 error Identifier 'campaign_language' is not in camel case camelcase + 117:15 error Identifier 'campaign_permission_reminder' is not in camel case camelcase + 119:13 error Identifier 'store_name' is not in camel case camelcase + 121:15 error Identifier 'admin_email' is not in camel case camelcase + 122:1 error Line 122 exceeds the maximum line length of 100 max-len + 122:15 error Identifier 'store_timezone' is not in camel case camelcase + 123:15 error Identifier 'store_name' is not in camel case camelcase + 124:15 error Identifier 'mailchimp_lists' is not in camel case camelcase + 124:42 error Identifier 'mailchimp_lists' is not in camel case camelcase + 125:15 error Identifier 'mailchimp_list' is not in camel case camelcase + 125:41 error Identifier 'mailchimp_list' is not in camel case camelcase + 134:12 error Identifier 'store_city' is not in camel case camelcase + 135:12 error Identifier 'store_street' is not in camel case camelcase + 136:12 error Identifier 'store_state' is not in camel case camelcase + 137:12 error Identifier 'store_country' is not in camel case camelcase + 138:12 error Identifier 'store_postal_code' is not in camel case camelcase + 139:12 error Identifier 'store_currency_code' is not in camel case camelcase + 187:5 error Identifier 'settings_values_missing' is not in camel case camelcase + 188:5 error Identifier 'input_field_has_changed' is not in camel case camelcase + 196:21 error Identifier 'settings_values_missing' is not in camel case camelcase + 203:21 error Identifier 'settings_values_missing' is not in camel case camelcase + 208:10 error Identifier 'mailchimp_list' is not in camel case camelcase + 209:21 error Identifier 'settings_values_missing' is not in camel case camelcase + 209:48 error Identifier 'mailchimp_list' is not in camel case camelcase + 210:9 error Identifier 'mailchimp_list' is not in camel case camelcase + 211:61 error Identifier 'mailchimp_list' is not in camel case camelcase + 211:61 error Identifier 'mailchimp_list' is not in camel case camelcase + 219:4 error Identifier 'api_key_input' is not in camel case camelcase + 220:4 error Identifier 'settings_values_missing' is not in camel case camelcase + 221:4 error Identifier 'input_field_has_changed' is not in camel case camelcase + 228:1 error Line 228 exceeds the maximum line length of 100 max-len + 232:27 error Identifier 'settings_values_missing' is not in camel case camelcase + 232:52 error Identifier 'input_field_has_changed' is not in camel case camelcase + 238:52 error Identifier 'input_field_has_changed' is not in camel case camelcase + 239:7 error Identifier 'settings_values_missing' is not in camel case camelcase + 251:22 error Identifier 'settings_values_missing' is not in camel case camelcase + 258:22 error Identifier 'settings_values_missing' is not in camel case camelcase + 301:1 error Expected indentation of 3 tabs but found 4 indent + 302:1 error Expected indentation of 4 tabs but found 5 indent + 303:1 error Expected indentation of 4 tabs but found 5 indent + 304:1 error Expected indentation of 4 tabs but found 5 indent + 305:1 error Expected indentation of 4 tabs but found 5 indent + 307:1 error Expected indentation of 4 tabs but found 5 indent + 308:1 error Expected indentation of 5 tabs but found 6 indent + 309:1 error Expected indentation of 6 tabs but found 7 indent + 310:1 error Expected indentation of 6 tabs but found 7 indent + 311:1 error Expected indentation of 6 tabs but found 7 indent + 312:1 error Expected indentation of 5 tabs but found 6 indent + 313:1 error Expected indentation of 5 tabs but found 6 indent + 314:1 error Expected indentation of 6 tabs but found 7 indent + 315:1 error Expected indentation of 6 tabs but found 7 indent + 316:1 error Expected indentation of 5 tabs but found 6 indent + 317:1 error Expected indentation of 4 tabs but found 5 indent + 318:1 error Expected indentation of 4 tabs but found 5 indent + 319:1 error Expected indentation of 5 tabs but found 6 indent + 320:1 error Expected indentation of 4 tabs but found 5 indent + 321:1 error Expected indentation of 3 tabs but found 4 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/campaign-defaults.js + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 49:1 error Expected indentation of 7 tabs but found 6 indent + 50:1 error Expected indentation of 8 tabs but found 7 indent + 51:1 error Expected indentation of 7 tabs but found 6 indent + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/key-input.js + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 34:1 error Expected indentation of 4 tabs but found 3 indent + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 35:1 error Expected indentation of 4 tabs but found 3 indent + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/log-into-mailchimp.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/newsletter-settings.js + 31:1 error Expected indentation of 4 tabs but found 5 indent + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/email/mailchimp/setup-steps/store-info.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/payments/index.js + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/payments/payment-method-edit-dialog.js + 89:1 error Line 89 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/payments/payment-method-item.js + 89:5 error Identifier 'payment_method' is not in camel case camelcase + 93:5 error Identifier 'payment_method' is not in camel case camelcase + 109:5 error Identifier 'payment_method' is not in camel case camelcase + 195:1 error Line 195 exceeds the maximum line length of 100 max-len + 200:1 error Line 200 exceeds the maximum line length of 100 max-len + 203:1 error Line 203 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/payments/payment-method-paypal.js + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/payments/payment-method-stripe.js + 33:5 error Identifier 'apple_pay' is not in camel case camelcase + 35:5 error Identifier 'secret_key' is not in camel case camelcase + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 36:5 error Identifier 'publishable_key' is not in camel case camelcase + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 38:5 error Identifier 'test_publishable_key' is not in camel case camelcase + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 39:5 error Identifier 'test_secret_key' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/payments/stripe/payment-method-stripe-connect-account.js + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + 107:1 error Line 107 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/payments/stripe/payment-method-stripe-connected-dialog.js + 29:5 error Identifier 'apple_pay' is not in camel case camelcase + 31:5 error Identifier 'secret_key' is not in camel case camelcase + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 32:5 error Identifier 'publishable_key' is not in camel case camelcase + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 34:5 error Identifier 'test_publishable_key' is not in camel case camelcase + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 35:5 error Identifier 'test_secret_key' is not in camel case camelcase + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/payments/stripe/payment-method-stripe-key-based-dialog.js + 33:5 error Identifier 'apple_pay' is not in camel case camelcase + 35:5 error Identifier 'secret_key' is not in camel case camelcase + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 36:5 error Identifier 'publishable_key' is not in camel case camelcase + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 38:5 error Identifier 'test_publishable_key' is not in camel case camelcase + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 39:5 error Identifier 'test_secret_key' is not in camel case camelcase + 163:1 error Line 163 exceeds the maximum line length of 100 max-len + 167:1 error Line 167 exceeds the maximum line length of 100 max-len + 180:1 error Line 180 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/payments/stripe/payment-method-stripe-utils.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'method' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone-list-entry.js + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone-list.js + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 129:1 error Line 129 exceeds the maximum line length of 100 max-len + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone/index.js + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone/shipping-methods/flat-rate.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone/shipping-methods/free-shipping.js + 26:46 error Identifier 'min_amount' is not in camel case camelcase + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 34:12 error Identifier 'min_amount' is not in camel case camelcase + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + 95:2 error Identifier 'min_amount' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone/shipping-zone-location-dialog-countries.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone/shipping-zone-location-dialog-settings.js + 119:1 error Line 119 exceeds the maximum line length of 100 max-len + 141:8 error Use ellipsis character (…) in place of three dots wpcalypso/i18n-ellipsis + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone/shipping-zone-location-dialog.js + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone/shipping-zone-location-list.js + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + 134:1 error Line 134 exceeds the maximum line length of 100 max-len + 164:1 error Line 164 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone/shipping-zone-method-dialog.js + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone/shipping-zone-method-list.js + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 153:1 error Line 153 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/shipping/shipping-zone/shipping-zone-name.js + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/taxes/save-button.js + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/settings/taxes/taxes-rates.js + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + 130:1 error Line 130 exceeds the maximum line length of 100 max-len + 210:1 error Line 210 exceeds the maximum line length of 100 max-len + 216:7 error Identifier 'state_rate' is not in camel case camelcase + 217:7 error Identifier 'combined_rate' is not in camel case camelcase + 218:7 error Identifier 'local_rate' is not in camel case camelcase + 218:20 error Identifier 'combined_rate' is not in camel case camelcase + 218:36 error Identifier 'state_rate' is not in camel case camelcase + 220:3 error Identifier 'state_rate' is not in camel case camelcase + 220:23 error Identifier 'state_rate' is not in camel case camelcase + 221:3 error Identifier 'combined_rate' is not in camel case camelcase + 221:26 error Identifier 'combined_rate' is not in camel case camelcase + 222:3 error Identifier 'local_rate' is not in camel case camelcase + 222:23 error Identifier 'local_rate' is not in camel case camelcase + 226:12 error Identifier 'state_rate' is not in camel case camelcase + 229:11 error Identifier 'state_rate' is not in camel case camelcase + 231:13 error Identifier 'local_rate' is not in camel case camelcase + 234:12 error Identifier 'local_rate' is not in camel case camelcase + 241:10 error Identifier 'combined_rate' is not in camel case camelcase + 266:1 error Line 266 exceeds the maximum line length of 100 max-len + 304:1 error Line 304 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/store-stats/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/store-stats/controller.js + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 73:4 error Identifier 'query_date' is not in camel case camelcase + 74:4 error Identifier 'selected_date' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/store-stats/index.js + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 129:1 error Line 129 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/store-stats/listview.js + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/store-stats/store-stats-chart/index.js + 33:1 error 'woocommerce/app/store-stats/constants' import is duplicated no-duplicate-imports + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + 112:1 error Line 112 exceeds the maximum line length of 100 max-len + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/store-stats/store-stats-module/index.js + 64:1 error Expected indentation of 6 tabs but found 5 indent + 65:1 error Expected indentation of 7 tabs but found 6 indent + 66:1 error Expected indentation of 6 tabs but found 5 indent + 67:1 error Expected indentation of 5 tabs but found 4 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/store-stats/store-stats-widget-list/index.js + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/store-stats/test/utils.js + 53:18 error Identifier 'total_refund' is not in camel case camelcase + 54:26 error Identifier 'total_refund' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/app/store-stats/utils.js + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + 103:1 error Line 103 exceeds the maximum line length of 100 max-len + 109:1 error Expected indentation of 3 tabs but found 4 indent + 110:1 error Expected indentation of 3 tabs but found 4 indent + 112:1 error Expected indentation of 3 tabs but found 4 indent + 113:1 error Expected indentation of 3 tabs but found 4 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/action-header/index.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/address-view/index.js + 97:1 error Line 97 exceeds the maximum line length of 100 max-len + 170:1 error Line 170 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/auth-capture-toggle/index.js + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/bulk-select/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/compact-tinymce/index.js + 82:4 error Identifier 'skin_url' is not in camel case camelcase + 84:4 error Identifier 'body_class' is not in camel case camelcase + 85:4 error Identifier 'content_css' is not in camel case camelcase + 87:4 error Identifier 'language_url' is not in camel case camelcase + 89:4 error Identifier 'relative_urls' is not in camel case camelcase + 90:4 error Identifier 'remove_script_host' is not in camel case camelcase + 91:4 error Identifier 'convert_urls' is not in camel case camelcase + 92:4 error Identifier 'browser_spellcheck' is not in camel case camelcase + 93:4 error Identifier 'fix_list_elements' is not in camel case camelcase + 94:4 error Identifier 'keep_styles' is not in camel case camelcase + 95:14 error Using this.refs is deprecated react/no-string-refs + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 96:4 error Identifier 'preview_styles' is not in camel case camelcase + 97:4 error Identifier 'end_container_on_empty_block' is not in camel case camelcase + 103:4 error Identifier 'redux_store' is not in camel case camelcase + 110:4 error Identifier 'add_unload_trigger' is not in camel case camelcase + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 158:15 error Using string literals in ref attributes is deprecated react/no-string-refs + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/delta/index.js + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/form-click-to-edit-input/index.js + 83:1 error Line 83 exceeds the maximum line length of 100 max-len + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/form-location-select/countries.js + 89:23 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + 92:23 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/form-location-select/states.js + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/list/list-header/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/list/list-item-field/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/list/list-item/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/list/list/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/location-flag/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/order-status/index.js + 12:4 error Identifier 'payment_method' is not in camel case camelcase + 22:19 error Identifier 'payment_method' is not in camel case camelcase + 28:20 error Identifier 'payment_method' is not in camel case camelcase + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/order-status/test/index.js + 21:4 error Identifier 'payment_method' is not in camel case camelcase + 65:4 error Identifier 'payment_method' is not in camel case camelcase + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/process-orders-widget/index.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/product-image-uploader/index.js + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + 107:1 error Line 107 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/product-reviews-widget/index.js + 54:3 error Identifier 'average_rating' is not in camel case camelcase + 55:3 error Identifier 'rating_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/product-search/index.js + 49:3 error Using this.refs is deprecated react/no-string-refs + 61:6 error Using string literals in ref attributes is deprecated react/no-string-refs + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/product-search/results.js + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 83:1 error Line 83 exceeds the maximum line length of 100 max-len + 96:3 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/reading-widget/index.js + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/share-widget/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 32:7 error Identifier 'app_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/store-address/index.js + 151:1 error Line 151 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/table/table-item/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/components/widget-group/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/index.js + 19:1 error 'my-sites/controller' import is duplicated no-duplicate-imports + 205:1 error Line 205 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/currency/index.js + 11:1 error Line 11 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/formatted-variation-name/test/index.js + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/generate-variations/index.js + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/generate-variations/test/index.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/get-address-view-format/test/index.js + 26:4 error Identifier 'address_1' is not in camel case camelcase + 27:4 error Identifier 'address_2' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/get-payment-method-details/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/order-values/test/fixtures/order-no-tax.js + 4:2 error Identifier 'line_items' is not in camel case camelcase + 15:2 error Identifier 'tax_lines' is not in camel case camelcase + 16:2 error Identifier 'shipping_lines' is not in camel case camelcase + 17:2 error Identifier 'fee_lines' is not in camel case camelcase + 22:4 error Identifier 'total_tax' is not in camel case camelcase + 25:2 error Identifier 'coupon_lines' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/order-values/test/fixtures/order-with-coupons.js + 4:2 error Identifier 'line_items' is not in camel case camelcase + 36:2 error Identifier 'tax_lines' is not in camel case camelcase + 39:4 error Identifier 'rate_code' is not in camel case camelcase + 40:4 error Identifier 'rate_id' is not in camel case camelcase + 43:4 error Identifier 'tax_total' is not in camel case camelcase + 44:4 error Identifier 'shipping_tax_total' is not in camel case camelcase + 47:2 error Identifier 'shipping_lines' is not in camel case camelcase + 50:4 error Identifier 'method_title' is not in camel case camelcase + 51:4 error Identifier 'method_id' is not in camel case camelcase + 53:4 error Identifier 'total_tax' is not in camel case camelcase + 63:2 error Identifier 'fee_lines' is not in camel case camelcase + 69:4 error Identifier 'total_tax' is not in camel case camelcase + 83:4 error Identifier 'total_tax' is not in camel case camelcase + 93:2 error Identifier 'coupon_lines' is not in camel case camelcase + 98:4 error Identifier 'discount_tax' is not in camel case camelcase + 104:4 error Identifier 'discount_tax' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/order-values/test/fixtures/order-with-refunds.js + 4:2 error Identifier 'line_items' is not in camel case camelcase + 36:2 error Identifier 'tax_lines' is not in camel case camelcase + 39:4 error Identifier 'rate_code' is not in camel case camelcase + 40:4 error Identifier 'rate_id' is not in camel case camelcase + 43:4 error Identifier 'tax_total' is not in camel case camelcase + 44:4 error Identifier 'shipping_tax_total' is not in camel case camelcase + 47:2 error Identifier 'shipping_lines' is not in camel case camelcase + 50:4 error Identifier 'method_title' is not in camel case camelcase + 51:4 error Identifier 'method_id' is not in camel case camelcase + 53:4 error Identifier 'total_tax' is not in camel case camelcase + 63:2 error Identifier 'fee_lines' is not in camel case camelcase + 64:2 error Identifier 'coupon_lines' is not in camel case camelcase + 69:4 error Identifier 'discount_tax' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/order-values/test/fixtures/order.js + 4:2 error Identifier 'line_items' is not in camel case camelcase + 36:2 error Identifier 'tax_lines' is not in camel case camelcase + 39:4 error Identifier 'rate_code' is not in camel case camelcase + 40:4 error Identifier 'rate_id' is not in camel case camelcase + 43:4 error Identifier 'tax_total' is not in camel case camelcase + 44:4 error Identifier 'shipping_tax_total' is not in camel case camelcase + 47:2 error Identifier 'shipping_lines' is not in camel case camelcase + 50:4 error Identifier 'method_title' is not in camel case camelcase + 51:4 error Identifier 'method_id' is not in camel case camelcase + 53:4 error Identifier 'total_tax' is not in camel case camelcase + 63:2 error Identifier 'fee_lines' is not in camel case camelcase + 69:4 error Identifier 'total_tax' is not in camel case camelcase + 79:2 error Identifier 'coupon_lines' is not in camel case camelcase + 84:4 error Identifier 'discount_tax' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/order-values/test/totals.js + 129:31 error Identifier 'line_items' is not in camel case camelcase + 147:28 error Identifier 'line_items' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/lib/redux-utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/action-list/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/action-list/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/action-list/test/fixtures/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/action-list/test/selectors.js + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/action-list/test/index.js + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + 103:1 error Line 103 exceeds the maximum line length of 100 max-len + 228:1 error Line 228 exceeds the maximum line length of 100 max-len + 230:1 error Line 230 exceeds the maximum line length of 100 max-len + 246:1 error Line 246 exceeds the maximum line length of 100 max-len + 248:1 error Line 248 exceeds the maximum line length of 100 max-len + 264:1 error Line 264 exceeds the maximum line length of 100 max-len + 266:1 error Line 266 exceeds the maximum line length of 100 max-len + 287:1 error Line 287 exceeds the maximum line length of 100 max-len + 336:1 error Line 336 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/payment-methods/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/product-categories/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/product-variations/test/index.js + 128:1 error Line 128 exceeds the maximum line length of 100 max-len + 226:1 error Line 226 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/products/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/shipping-zone-locations/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 9:1 error Line 9 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/shipping-zone-methods/index.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 28:22 error Identifier 'method_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/shipping-zones/index.js + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/ui/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/ui/payments/index.js + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + 155:1 error Line 155 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/ui/products/index.js + 108:1 error Expected JSDoc for 'variationEdits' but found 'successAction' valid-jsdoc + 108:1 error Expected JSDoc for 'onSuccess' but found 'failureAction' valid-jsdoc + 108:1 error Missing JSDoc for parameter 'onFailure' valid-jsdoc + 114:1 error Line 114 exceeds the maximum line length of 100 max-len + 207:1 error Line 207 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/ui/products/test/index.js + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + 199:4 error Identifier 'regular_price' is not in camel case camelcase + 204:4 error Identifier 'regular_price' is not in camel case camelcase + 206:41 error Identifier 'regular_price' is not in camel case camelcase + 320:1 error Line 320 exceeds the maximum line length of 100 max-len + 355:1 error Line 355 exceeds the maximum line length of 100 max-len + 409:1 error Line 409 exceeds the maximum line length of 100 max-len + 416:1 error Line 416 exceeds the maximum line length of 100 max-len + 466:1 error Line 466 exceeds the maximum line length of 100 max-len + 500:1 error Line 500 exceeds the maximum line length of 100 max-len + 531:1 error Line 531 exceeds the maximum line length of 100 max-len + 538:1 error Line 538 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/ui/shipping-zones/index.js + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 41:1 error 'woocommerce/state/ui/shipping/zones/selectors' import is duplicated no-duplicate-imports + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 53:1 error 'woocommerce/state/ui/shipping/zones/selectors' import is duplicated no-duplicate-imports + 185:1 error Line 185 exceeds the maximum line length of 100 max-len + 203:6 error Identifier 'shipping_method' is not in camel case camelcase + 241:45 error Identifier 'shipping_method' is not in camel case camelcase + 267:1 error Line 267 exceeds the maximum line length of 100 max-len + 283:6 error Identifier 'shipping_method' is not in camel case camelcase + 306:1 error Line 306 exceeds the maximum line length of 100 max-len + 308:1 error Line 308 exceeds the maximum line length of 100 max-len + 311:6 error Identifier 'shipping_method' is not in camel case camelcase + 340:1 error Line 340 exceeds the maximum line length of 100 max-len + 341:1 error Line 341 exceeds the maximum line length of 100 max-len + 353:1 error Line 353 exceeds the maximum line length of 100 max-len + 357:1 error Line 357 exceeds the maximum line length of 100 max-len + 407:1 error Line 407 exceeds the maximum line length of 100 max-len + 410:1 error Line 410 exceeds the maximum line length of 100 max-len + 446:1 error Line 446 exceeds the maximum line length of 100 max-len + 447:1 error Line 447 exceeds the maximum line length of 100 max-len + 525:1 error Line 525 exceeds the maximum line length of 100 max-len + 535:1 error Line 535 exceeds the maximum line length of 100 max-len + 551:1 error Line 551 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/data-layer/ui/woocommerce-services/index.js + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/helpers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 25:1 error Expected indentation of 3 tabs but found 4 indent + 26:1 error Expected indentation of 3 tabs but found 4 indent + 27:1 error Expected indentation of 2 tabs but found 3 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/selectors/promotions.js + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/coupons/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:9 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/coupons/handlers.js + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 54:22 error 'dispatch' is defined but never used no-unused-vars + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/coupons/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/coupons/test/handlers.js + 25:52 error Identifier 'per_page' is not in camel case camelcase + 54:30 error Identifier 'per_page' is not in camel case camelcase + 76:52 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/coupons/test/reducer.js + 22:4 error Identifier 'discount_type' is not in camel case camelcase + 28:4 error Identifier 'discount_type' is not in camel case camelcase + 34:4 error Identifier 'discount_type' is not in camel case camelcase + 43:23 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/currencies/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/currencies/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/currencies/selectors.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/http-request.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 93:1 error Line 93 exceeds the maximum line length of 100 max-len + 107:1 error Line 107 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/locations/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/locations/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/locations/selectors.js + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 93:1 error Line 93 exceeds the maximum line length of 100 max-len + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 118:1 error Line 118 exceeds the maximum line length of 100 max-len + 142:1 error Line 142 exceeds the maximum line length of 100 max-len + 143:1 error Line 143 exceeds the maximum line length of 100 max-len + 144:1 error Line 144 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/meta/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/meta/taxrates/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/meta/taxrates/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/activity-log/selectors.js + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 75:1 error Line 75 exceeds the maximum line length of 100 max-len + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 113:1 error Line 113 exceeds the maximum line length of 100 max-len + 133:1 error Line 133 exceeds the maximum line length of 100 max-len + 142:1 error Line 142 exceeds the maximum line length of 100 max-len + 143:1 error Line 143 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/activity-log/test/selectors.js + 133:10 error Identifier 'date_created_gmt' is not in camel case camelcase + 135:10 error Identifier 'customer_note' is not in camel case camelcase + 139:10 error Identifier 'date_created_gmt' is not in camel case camelcase + 141:10 error Identifier 'customer_note' is not in camel case camelcase + 159:10 error Identifier 'label_id' is not in camel case camelcase + 160:10 error Identifier 'refundable_amount' is not in camel case camelcase + 163:10 error Identifier 'created_date' is not in camel case camelcase + 164:10 error Identifier 'used_date' is not in camel case camelcase + 165:10 error Identifier 'expiry_date' is not in camel case camelcase + 166:10 error Identifier 'product_names' is not in camel case camelcase + 167:10 error Identifier 'package_name' is not in camel case camelcase + 169:10 error Identifier 'carrier_id' is not in camel case camelcase + 170:10 error Identifier 'service_name' is not in camel case camelcase + 173:11 error Identifier 'request_date' is not in camel case camelcase + 174:11 error Identifier 'refund_date' is not in camel case camelcase + 178:10 error Identifier 'label_id' is not in camel case camelcase + 179:10 error Identifier 'refundable_amount' is not in camel case camelcase + 182:10 error Identifier 'created_date' is not in camel case camelcase + 183:10 error Identifier 'used_date' is not in camel case camelcase + 184:10 error Identifier 'expiry_date' is not in camel case camelcase + 185:10 error Identifier 'product_names' is not in camel case camelcase + 186:10 error Identifier 'package_name' is not in camel case camelcase + 188:10 error Identifier 'carrier_id' is not in camel case camelcase + 189:10 error Identifier 'service_name' is not in camel case camelcase + 192:11 error Identifier 'request_date' is not in camel case camelcase + 193:11 error Identifier 'refund_date' is not in camel case camelcase + 198:10 error Identifier 'label_id' is not in camel case camelcase + 199:10 error Identifier 'refundable_amount' is not in camel case camelcase + 202:10 error Identifier 'created_date' is not in camel case camelcase + 203:10 error Identifier 'used_date' is not in camel case camelcase + 204:10 error Identifier 'expiry_date' is not in camel case camelcase + 205:10 error Identifier 'product_names' is not in camel case camelcase + 206:10 error Identifier 'package_name' is not in camel case camelcase + 208:10 error Identifier 'carrier_id' is not in camel case camelcase + 209:10 error Identifier 'service_name' is not in camel case camelcase + 212:11 error Identifier 'request_date' is not in camel case camelcase + 216:10 error Identifier 'label_id' is not in camel case camelcase + 217:10 error Identifier 'refundable_amount' is not in camel case camelcase + 220:10 error Identifier 'created_date' is not in camel case camelcase + 221:10 error Identifier 'used_date' is not in camel case camelcase + 222:10 error Identifier 'expiry_date' is not in camel case camelcase + 223:10 error Identifier 'product_names' is not in camel case camelcase + 224:10 error Identifier 'package_name' is not in camel case camelcase + 226:10 error Identifier 'carrier_id' is not in camel case camelcase + 227:10 error Identifier 'service_name' is not in camel case camelcase + 251:1 error Line 251 exceeds the maximum line length of 100 max-len + 252:1 error Line 252 exceeds the maximum line length of 100 max-len + 283:1 error Line 283 exceeds the maximum line length of 100 max-len + 284:1 error Line 284 exceeds the maximum line length of 100 max-len + 315:1 error Line 315 exceeds the maximum line length of 100 max-len + 316:1 error Line 316 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/notes/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/notes/selectors.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 83:1 error Line 83 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/notes/test/actions.js + 116:4 error Identifier 'customer_note' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/notes/test/fixtures/note.js + 10:2 error Identifier 'customer_note' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/notes/test/fixtures/notes.js + 11:3 error Identifier 'customer_note' is not in camel case camelcase + 16:3 error Identifier 'customer_note' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/reducer.js + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/refunds/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/refunds/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/refunds/selectors.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/refunds/test/actions.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/selectors.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 118:1 error Line 118 exceeds the maximum line length of 100 max-len + 119:1 error Line 119 exceeds the maximum line length of 100 max-len + 146:1 error Line 146 exceeds the maximum line length of 100 max-len + 159:1 error Line 159 exceeds the maximum line length of 100 max-len + 160:1 error Line 160 exceeds the maximum line length of 100 max-len + 174:1 error Line 174 exceeds the maximum line length of 100 max-len + 178:1 error Line 178 exceeds the maximum line length of 100 max-len + 197:1 error Line 197 exceeds the maximum line length of 100 max-len + 204:19 error Identifier 'payment_method' is not in camel case camelcase + 205:51 error Identifier 'payment_method' is not in camel case camelcase + 211:1 error Line 211 exceeds the maximum line length of 100 max-len + 221:1 error Line 221 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/test/fixtures/order.js + 12:2 error Identifier 'total_tax' is not in camel case camelcase + 13:2 error Identifier 'prices_include_tax' is not in camel case camelcase + 16:2 error Identifier 'payment_method' is not in camel case camelcase + 17:2 error Identifier 'payment_method_title' is not in camel case camelcase + 18:2 error Identifier 'meta_data' is not in camel case camelcase + 19:2 error Identifier 'line_items' is not in camel case camelcase + 26:2 error Identifier 'tax_lines' is not in camel case camelcase + 27:2 error Identifier 'shipping_lines' is not in camel case camelcase + 30:4 error Identifier 'method_title' is not in camel case camelcase + 31:4 error Identifier 'method_id' is not in camel case camelcase + 33:4 error Identifier 'total_tax' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/test/fixtures/orders.js + 13:3 error Identifier 'total_tax' is not in camel case camelcase + 14:3 error Identifier 'prices_include_tax' is not in camel case camelcase + 17:3 error Identifier 'payment_method' is not in camel case camelcase + 18:3 error Identifier 'payment_method_title' is not in camel case camelcase + 19:3 error Identifier 'meta_data' is not in camel case camelcase + 20:3 error Identifier 'line_items' is not in camel case camelcase + 27:3 error Identifier 'tax_lines' is not in camel case camelcase + 28:3 error Identifier 'shipping_lines' is not in camel case camelcase + 31:5 error Identifier 'method_title' is not in camel case camelcase + 32:5 error Identifier 'method_id' is not in camel case camelcase + 34:5 error Identifier 'total_tax' is not in camel case camelcase + 44:3 error Identifier 'total_tax' is not in camel case camelcase + 45:3 error Identifier 'prices_include_tax' is not in camel case camelcase + 48:3 error Identifier 'payment_method' is not in camel case camelcase + 49:3 error Identifier 'payment_method_title' is not in camel case camelcase + 50:3 error Identifier 'meta_data' is not in camel case camelcase + 51:3 error Identifier 'line_items' is not in camel case camelcase + 58:3 error Identifier 'tax_lines' is not in camel case camelcase + 59:3 error Identifier 'shipping_lines' is not in camel case camelcase + 62:5 error Identifier 'method_title' is not in camel case camelcase + 63:5 error Identifier 'method_id' is not in camel case camelcase + 65:5 error Identifier 'total_tax' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/test/selectors.js + 100:3 error Identifier 'total_tax' is not in camel case camelcase + 101:3 error Identifier 'prices_include_tax' is not in camel case camelcase + 104:3 error Identifier 'payment_method' is not in camel case camelcase + 105:3 error Identifier 'payment_method_title' is not in camel case camelcase + 106:3 error Identifier 'meta_data' is not in camel case camelcase + 107:3 error Identifier 'line_items' is not in camel case camelcase + 114:3 error Identifier 'tax_lines' is not in camel case camelcase + 115:3 error Identifier 'shipping_lines' is not in camel case camelcase + 118:5 error Identifier 'method_title' is not in camel case camelcase + 119:5 error Identifier 'method_id' is not in camel case camelcase + 121:5 error Identifier 'total_tax' is not in camel case camelcase + 390:1 error Line 390 exceeds the maximum line length of 100 max-len + 397:1 error Line 397 exceeds the maximum line length of 100 max-len + 405:1 error Line 405 exceeds the maximum line length of 100 max-len + 413:1 error Line 413 exceeds the maximum line length of 100 max-len + 420:1 error Line 420 exceeds the maximum line length of 100 max-len + 421:1 error Line 421 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/test/utils.js + 22:4 error Identifier 'line_items' is not in camel case camelcase + 51:4 error Identifier 'fee_lines' is not in camel case camelcase + 70:4 error Identifier 'line_items' is not in camel case camelcase + 82:4 error Identifier 'fee_lines' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/orders/utils.js + 9:2 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/payment-methods/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/payment-methods/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/payment-methods/selectors.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/payment-methods/test/actions.js + 33:7 error Identifier 'method_title' is not in camel case camelcase + 34:7 error Identifier 'method_description' is not in camel case camelcase + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 48:7 error Identifier 'method_title' is not in camel case camelcase + 49:7 error Identifier 'method_description' is not in camel case camelcase + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 67:6 error Identifier 'method_title' is not in camel case camelcase + 69:6 error Identifier 'method_description' is not in camel case camelcase + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + 83:6 error Identifier 'method_title' is not in camel case camelcase + 85:6 error Identifier 'method_description' is not in camel case camelcase + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/payment-methods/test/reducer.js + 50:2 error Test title is used multiple times in the same test suite jest/no-identical-title + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/payment-methods/test/selectors.js + 46:8 error Identifier 'method_title' is not in camel case camelcase + 48:8 error Identifier 'method_description' is not in camel case camelcase + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 128:5 error Identifier 'method_title' is not in camel case camelcase + 130:5 error Identifier 'method_description' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/product-categories/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/product-categories/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/product-categories/selectors.js + 14:1 error Missing JSDoc parameter type for 'Number' valid-jsdoc + 14:1 error Expected JSDoc for 'siteId' but found 'Number' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/product-categories/test/actions.js + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/product-variations/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/product-variations/test/fixtures/variations.js + 11:4 error Identifier 'date_created' is not in camel case camelcase + 12:4 error Identifier 'date_created_gmt' is not in camel case camelcase + 13:4 error Identifier 'date_modified' is not in camel case camelcase + 14:4 error Identifier 'date_modified_gmt' is not in camel case camelcase + 19:4 error Identifier 'regular_price' is not in camel case camelcase + 20:4 error Identifier 'sale_price' is not in camel case camelcase + 21:4 error Identifier 'date_on_sale_from' is not in camel case camelcase + 22:4 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 23:4 error Identifier 'date_on_sale_to' is not in camel case camelcase + 24:4 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + 25:4 error Identifier 'on_sale' is not in camel case camelcase + 31:4 error Identifier 'download_limit' is not in camel case camelcase + 32:4 error Identifier 'download_expiry' is not in camel case camelcase + 33:4 error Identifier 'tax_status' is not in camel case camelcase + 34:4 error Identifier 'tax_class' is not in camel case camelcase + 35:4 error Identifier 'manage_stock' is not in camel case camelcase + 36:4 error Identifier 'stock_quantity' is not in camel case camelcase + 37:4 error Identifier 'in_stock' is not in camel case camelcase + 39:4 error Identifier 'backorders_allowed' is not in camel case camelcase + 47:4 error Identifier 'shipping_class' is not in camel case camelcase + 48:4 error Identifier 'shipping_class_id' is not in camel case camelcase + 51:5 error Identifier 'date_created' is not in camel case camelcase + 52:5 error Identifier 'date_created_gmt' is not in camel case camelcase + 53:5 error Identifier 'date_modified' is not in camel case camelcase + 54:5 error Identifier 'date_modified_gmt' is not in camel case camelcase + 67:4 error Identifier 'menu_order' is not in camel case camelcase + 68:4 error Identifier 'meta_data' is not in camel case camelcase + 89:4 error Identifier 'date_created' is not in camel case camelcase + 90:4 error Identifier 'date_created_gmt' is not in camel case camelcase + 91:4 error Identifier 'date_modified' is not in camel case camelcase + 92:4 error Identifier 'date_modified_gmt' is not in camel case camelcase + 97:4 error Identifier 'regular_price' is not in camel case camelcase + 98:4 error Identifier 'sale_price' is not in camel case camelcase + 99:4 error Identifier 'date_on_sale_from' is not in camel case camelcase + 100:4 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 101:4 error Identifier 'date_on_sale_to' is not in camel case camelcase + 102:4 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + 103:4 error Identifier 'on_sale' is not in camel case camelcase + 109:4 error Identifier 'download_limit' is not in camel case camelcase + 110:4 error Identifier 'download_expiry' is not in camel case camelcase + 111:4 error Identifier 'tax_status' is not in camel case camelcase + 112:4 error Identifier 'tax_class' is not in camel case camelcase + 113:4 error Identifier 'manage_stock' is not in camel case camelcase + 114:4 error Identifier 'stock_quantity' is not in camel case camelcase + 115:4 error Identifier 'in_stock' is not in camel case camelcase + 117:4 error Identifier 'backorders_allowed' is not in camel case camelcase + 125:4 error Identifier 'shipping_class' is not in camel case camelcase + 126:4 error Identifier 'shipping_class_id' is not in camel case camelcase + 129:5 error Identifier 'date_created' is not in camel case camelcase + 130:5 error Identifier 'date_created_gmt' is not in camel case camelcase + 131:5 error Identifier 'date_modified' is not in camel case camelcase + 132:5 error Identifier 'date_modified_gmt' is not in camel case camelcase + 145:4 error Identifier 'menu_order' is not in camel case camelcase + 146:4 error Identifier 'meta_data' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/products/actions.js + 168:9 error Identifier 'per_page' is not in camel case camelcase + 215:3 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/products/selectors.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 34:22 error Identifier 'per_page' is not in camel case camelcase + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 59:22 error Identifier 'per_page' is not in camel case camelcase + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 110:22 error Identifier 'per_page' is not in camel case camelcase + 131:1 error Line 131 exceeds the maximum line length of 100 max-len + 132:1 error Line 132 exceeds the maximum line length of 100 max-len + 136:22 error Identifier 'per_page' is not in camel case camelcase + 156:1 error Line 156 exceeds the maximum line length of 100 max-len + 169:1 error Line 169 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/products/test/actions.js + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 71:24 error Identifier 'per_page' is not in camel case camelcase + 84:25 error Identifier 'per_page' is not in camel case camelcase + 113:40 error Identifier 'per_page' is not in camel case camelcase + 158:1 error Line 158 exceeds the maximum line length of 100 max-len + 177:24 error Identifier 'per_page' is not in camel case camelcase + 185:1 error Line 185 exceeds the maximum line length of 100 max-len + 191:25 error Identifier 'per_page' is not in camel case camelcase + 202:1 error Line 202 exceeds the maximum line length of 100 max-len + 244:41 error Identifier 'per_page' is not in camel case camelcase + 261:25 error Identifier 'per_page' is not in camel case camelcase + 304:1 error Line 304 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/products/test/fixtures/product.js + 12:2 error Identifier 'date_created' is not in camel case camelcase + 13:2 error Identifier 'date_created_gmt' is not in camel case camelcase + 14:2 error Identifier 'date_modified' is not in camel case camelcase + 15:2 error Identifier 'date_modified_gmt' is not in camel case camelcase + 19:2 error Identifier 'catalog_visibility' is not in camel case camelcase + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 22:2 error Identifier 'short_description' is not in camel case camelcase + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 26:2 error Identifier 'regular_price' is not in camel case camelcase + 27:2 error Identifier 'sale_price' is not in camel case camelcase + 28:2 error Identifier 'date_on_sale_from' is not in camel case camelcase + 29:2 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 30:2 error Identifier 'date_on_sale_to' is not in camel case camelcase + 31:2 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + 32:2 error Identifier 'price_html' is not in camel case camelcase + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 34:2 error Identifier 'on_sale' is not in camel case camelcase + 36:2 error Identifier 'total_sales' is not in camel case camelcase + 40:2 error Identifier 'download_limit' is not in camel case camelcase + 41:2 error Identifier 'download_expiry' is not in camel case camelcase + 42:2 error Identifier 'external_url' is not in camel case camelcase + 43:2 error Identifier 'button_text' is not in camel case camelcase + 44:2 error Identifier 'tax_status' is not in camel case camelcase + 45:2 error Identifier 'tax_class' is not in camel case camelcase + 46:2 error Identifier 'manage_stock' is not in camel case camelcase + 47:2 error Identifier 'stock_quantity' is not in camel case camelcase + 48:2 error Identifier 'in_stock' is not in camel case camelcase + 50:2 error Identifier 'backorders_allowed' is not in camel case camelcase + 52:2 error Identifier 'sold_individually' is not in camel case camelcase + 59:2 error Identifier 'shipping_required' is not in camel case camelcase + 60:2 error Identifier 'shipping_taxable' is not in camel case camelcase + 61:2 error Identifier 'shipping_class' is not in camel case camelcase + 62:2 error Identifier 'shipping_class_id' is not in camel case camelcase + 63:2 error Identifier 'reviews_allowed' is not in camel case camelcase + 64:2 error Identifier 'average_rating' is not in camel case camelcase + 65:2 error Identifier 'rating_count' is not in camel case camelcase + 66:2 error Identifier 'related_ids' is not in camel case camelcase + 67:2 error Identifier 'upsell_ids' is not in camel case camelcase + 68:2 error Identifier 'cross_sell_ids' is not in camel case camelcase + 69:2 error Identifier 'parent_id' is not in camel case camelcase + 70:2 error Identifier 'purchase_note' is not in camel case camelcase + 75:2 error Identifier 'default_attributes' is not in camel case camelcase + 77:2 error Identifier 'grouped_products' is not in camel case camelcase + 78:2 error Identifier 'menu_order' is not in camel case camelcase + 79:2 error Identifier 'meta_data' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/products/test/fixtures/products.js + 13:3 error Identifier 'date_created' is not in camel case camelcase + 14:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 15:3 error Identifier 'date_modified' is not in camel case camelcase + 16:3 error Identifier 'date_modified_gmt' is not in camel case camelcase + 20:3 error Identifier 'catalog_visibility' is not in camel case camelcase + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + 23:3 error Identifier 'short_description' is not in camel case camelcase + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 27:3 error Identifier 'regular_price' is not in camel case camelcase + 28:3 error Identifier 'sale_price' is not in camel case camelcase + 29:3 error Identifier 'date_on_sale_from' is not in camel case camelcase + 30:3 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 31:3 error Identifier 'date_on_sale_to' is not in camel case camelcase + 32:3 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + 33:3 error Identifier 'price_html' is not in camel case camelcase + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 35:3 error Identifier 'on_sale' is not in camel case camelcase + 37:3 error Identifier 'total_sales' is not in camel case camelcase + 41:3 error Identifier 'download_limit' is not in camel case camelcase + 42:3 error Identifier 'download_expiry' is not in camel case camelcase + 43:3 error Identifier 'external_url' is not in camel case camelcase + 44:3 error Identifier 'button_text' is not in camel case camelcase + 45:3 error Identifier 'tax_status' is not in camel case camelcase + 46:3 error Identifier 'tax_class' is not in camel case camelcase + 47:3 error Identifier 'manage_stock' is not in camel case camelcase + 48:3 error Identifier 'stock_quantity' is not in camel case camelcase + 49:3 error Identifier 'in_stock' is not in camel case camelcase + 51:3 error Identifier 'backorders_allowed' is not in camel case camelcase + 53:3 error Identifier 'sold_individually' is not in camel case camelcase + 60:3 error Identifier 'shipping_required' is not in camel case camelcase + 61:3 error Identifier 'shipping_taxable' is not in camel case camelcase + 62:3 error Identifier 'shipping_class' is not in camel case camelcase + 63:3 error Identifier 'shipping_class_id' is not in camel case camelcase + 64:3 error Identifier 'reviews_allowed' is not in camel case camelcase + 65:3 error Identifier 'average_rating' is not in camel case camelcase + 66:3 error Identifier 'rating_count' is not in camel case camelcase + 67:3 error Identifier 'related_ids' is not in camel case camelcase + 68:3 error Identifier 'upsell_ids' is not in camel case camelcase + 69:3 error Identifier 'cross_sell_ids' is not in camel case camelcase + 70:3 error Identifier 'parent_id' is not in camel case camelcase + 71:3 error Identifier 'purchase_note' is not in camel case camelcase + 76:3 error Identifier 'default_attributes' is not in camel case camelcase + 78:3 error Identifier 'grouped_products' is not in camel case camelcase + 79:3 error Identifier 'menu_order' is not in camel case camelcase + 80:3 error Identifier 'meta_data' is not in camel case camelcase + 87:3 error Identifier 'date_created' is not in camel case camelcase + 88:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 89:3 error Identifier 'date_modified' is not in camel case camelcase + 90:3 error Identifier 'date_modified_gmt' is not in camel case camelcase + 94:3 error Identifier 'catalog_visibility' is not in camel case camelcase + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 97:3 error Identifier 'short_description' is not in camel case camelcase + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + 101:3 error Identifier 'regular_price' is not in camel case camelcase + 102:3 error Identifier 'sale_price' is not in camel case camelcase + 103:3 error Identifier 'date_on_sale_from' is not in camel case camelcase + 104:3 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 105:3 error Identifier 'date_on_sale_to' is not in camel case camelcase + 106:3 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + 107:3 error Identifier 'price_html' is not in camel case camelcase + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + 109:3 error Identifier 'on_sale' is not in camel case camelcase + 111:3 error Identifier 'total_sales' is not in camel case camelcase + 115:3 error Identifier 'download_limit' is not in camel case camelcase + 116:3 error Identifier 'download_expiry' is not in camel case camelcase + 117:3 error Identifier 'external_url' is not in camel case camelcase + 118:3 error Identifier 'button_text' is not in camel case camelcase + 119:3 error Identifier 'tax_status' is not in camel case camelcase + 120:3 error Identifier 'tax_class' is not in camel case camelcase + 121:3 error Identifier 'manage_stock' is not in camel case camelcase + 122:3 error Identifier 'stock_quantity' is not in camel case camelcase + 123:3 error Identifier 'in_stock' is not in camel case camelcase + 125:3 error Identifier 'backorders_allowed' is not in camel case camelcase + 127:3 error Identifier 'sold_individually' is not in camel case camelcase + 134:3 error Identifier 'shipping_required' is not in camel case camelcase + 135:3 error Identifier 'shipping_taxable' is not in camel case camelcase + 136:3 error Identifier 'shipping_class' is not in camel case camelcase + 137:3 error Identifier 'shipping_class_id' is not in camel case camelcase + 138:3 error Identifier 'reviews_allowed' is not in camel case camelcase + 139:3 error Identifier 'average_rating' is not in camel case camelcase + 140:3 error Identifier 'rating_count' is not in camel case camelcase + 141:3 error Identifier 'related_ids' is not in camel case camelcase + 142:3 error Identifier 'upsell_ids' is not in camel case camelcase + 143:3 error Identifier 'cross_sell_ids' is not in camel case camelcase + 144:3 error Identifier 'parent_id' is not in camel case camelcase + 145:3 error Identifier 'purchase_note' is not in camel case camelcase + 150:3 error Identifier 'default_attributes' is not in camel case camelcase + 152:3 error Identifier 'grouped_products' is not in camel case camelcase + 153:3 error Identifier 'menu_order' is not in camel case camelcase + 154:3 error Identifier 'meta_data' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/products/test/reducer.js + 37:30 error Identifier 'per_page' is not in camel case camelcase + 50:30 error Identifier 'per_page' is not in camel case camelcase + 69:24 error Identifier 'per_page' is not in camel case camelcase + 77:30 error Identifier 'per_page' is not in camel case camelcase + 98:24 error Identifier 'per_page' is not in camel case camelcase + 109:24 error Identifier 'per_page' is not in camel case camelcase + 120:30 error Identifier 'per_page' is not in camel case camelcase + 137:30 error Identifier 'per_page' is not in camel case camelcase + 151:24 error Identifier 'per_page' is not in camel case camelcase + 160:30 error Identifier 'per_page' is not in camel case camelcase + 178:30 error Identifier 'per_page' is not in camel case camelcase + 191:30 error Identifier 'per_page' is not in camel case camelcase + 204:48 error Identifier 'per_page' is not in camel case camelcase + 212:30 error Identifier 'per_page' is not in camel case camelcase + 227:30 error Identifier 'per_page' is not in camel case camelcase + 254:1 error Line 254 exceeds the maximum line length of 100 max-len + 254:58 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/products/test/selectors.js + 36:37 error Identifier 'per_page' is not in camel case camelcase + 40:38 error Identifier 'per_page' is not in camel case camelcase + 59:38 error Identifier 'per_page' is not in camel case camelcase + 65:37 error Identifier 'per_page' is not in camel case camelcase + 76:38 error Identifier 'per_page' is not in camel case camelcase + 80:37 error Identifier 'per_page' is not in camel case camelcase + 109:29 error Identifier 'per_page' is not in camel case camelcase + 133:29 error Identifier 'per_page' is not in camel case camelcase + 200:29 error Identifier 'per_page' is not in camel case camelcase + 224:29 error Identifier 'per_page' is not in camel case camelcase + 227:1 error Line 227 exceeds the maximum line length of 100 max-len + 282:1 error Line 282 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/promotions/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/promotions/handlers.js + 49:48 error Identifier 'per_page' is not in camel case camelcase + 52:47 error Identifier 'per_page' is not in camel case camelcase + 67:47 error Identifier 'per_page' is not in camel case camelcase + 84:46 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/promotions/helpers.js + 49:10 error Identifier 'product_ids' is not in camel case camelcase + 49:23 error Identifier 'product_categories' is not in camel case camelcase + 54:7 error Identifier 'product_ids' is not in camel case camelcase + 54:22 error Identifier 'product_ids' is not in camel case camelcase + 55:26 error Identifier 'product_ids' is not in camel case camelcase + 59:7 error Identifier 'product_categories' is not in camel case camelcase + 59:29 error Identifier 'product_categories' is not in camel case camelcase + 60:34 error Identifier 'product_categories' is not in camel case camelcase + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/promotions/reducer.js + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/promotions/test/fixtures/coupons.js + 5:2 error Identifier 'discount_type' is not in camel case camelcase + 6:2 error Identifier 'date_created_gmt' is not in camel case camelcase + 7:2 error Identifier 'date_expires_gmt' is not in camel case camelcase + 14:2 error Identifier 'discount_type' is not in camel case camelcase + 15:2 error Identifier 'date_created_gmt' is not in camel case camelcase + 16:2 error Identifier 'date_expires_gmt' is not in camel case camelcase + 17:2 error Identifier 'product_ids' is not in camel case camelcase + 24:2 error Identifier 'discount_type' is not in camel case camelcase + 25:2 error Identifier 'date_created_gmt' is not in camel case camelcase + 26:2 error Identifier 'date_expires_gmt' is not in camel case camelcase + 27:2 error Identifier 'product_categories' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/promotions/test/fixtures/products.js + 5:2 error Identifier 'regular_price' is not in camel case camelcase + 6:2 error Identifier 'sale_price' is not in camel case camelcase + 7:2 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 8:2 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + 17:2 error Identifier 'regular_price' is not in camel case camelcase + 18:2 error Identifier 'sale_price' is not in camel case camelcase + 19:2 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 20:2 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/promotions/test/fixtures/promotions.js + 3:43 error Identifier 'per_page' is not in camel case camelcase + 9:3 error Identifier 'discount_type' is not in camel case camelcase + 10:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 11:3 error Identifier 'date_expires_gmt' is not in camel case camelcase + 17:3 error Identifier 'discount_type' is not in camel case camelcase + 18:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 19:3 error Identifier 'date_expires_gmt' is not in camel case camelcase + 25:3 error Identifier 'discount_type' is not in camel case camelcase + 26:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 27:3 error Identifier 'date_expires_gmt' is not in camel case camelcase + 33:3 error Identifier 'discount_type' is not in camel case camelcase + 34:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 35:3 error Identifier 'date_expires_gmt' is not in camel case camelcase + 41:3 error Identifier 'discount_type' is not in camel case camelcase + 42:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 43:3 error Identifier 'date_expires_gmt' is not in camel case camelcase + 47:43 error Identifier 'per_page' is not in camel case camelcase + 53:3 error Identifier 'discount_type' is not in camel case camelcase + 54:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 55:3 error Identifier 'date_expires_gmt' is not in camel case camelcase + 61:3 error Identifier 'discount_type' is not in camel case camelcase + 62:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 63:3 error Identifier 'date_expires_gmt' is not in camel case camelcase + 67:44 error Identifier 'per_page' is not in camel case camelcase + 73:3 error Identifier 'regular_price' is not in camel case camelcase + 74:3 error Identifier 'sale_price' is not in camel case camelcase + 75:3 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 76:3 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + 82:3 error Identifier 'regular_price' is not in camel case camelcase + 83:3 error Identifier 'sale_price' is not in camel case camelcase + 84:3 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 85:3 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + 91:3 error Identifier 'regular_price' is not in camel case camelcase + 92:3 error Identifier 'sale_price' is not in camel case camelcase + 93:3 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 94:3 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + 98:44 error Identifier 'per_page' is not in camel case camelcase + 104:3 error Identifier 'regular_price' is not in camel case camelcase + 105:3 error Identifier 'sale_price' is not in camel case camelcase + 106:3 error Identifier 'date_on_sale_from_gmt' is not in camel case camelcase + 107:3 error Identifier 'date_on_sale_to_gmt' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/promotions/test/handlers.js + 37:27 error Identifier 'per_page' is not in camel case camelcase + 56:26 error Identifier 'per_page' is not in camel case camelcase + 65:27 error Identifier 'per_page' is not in camel case camelcase + 79:26 error Identifier 'per_page' is not in camel case camelcase + 98:26 error Identifier 'per_page' is not in camel case camelcase + 117:26 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/promotions/test/helpers.js + 77:5 error Identifier 'individual_use' is not in camel case camelcase + 78:5 error Identifier 'usage_limit' is not in camel case camelcase + 79:5 error Identifier 'usage_limit_per_user' is not in camel case camelcase + 80:5 error Identifier 'free_shipping' is not in camel case camelcase + 81:5 error Identifier 'minimum_amount' is not in camel case camelcase + 82:5 error Identifier 'maximum_amount' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/request.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/review-replies/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/review-replies/handlers.js + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 89:1 error Line 89 exceeds the maximum line length of 100 max-len + 125:52 error 'getState' is defined but never used no-unused-vars + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/review-replies/selectors.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/review-replies/test/actions.js + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/review-replies/test/fixtures/review-replies.js + 13:3 error Identifier 'author_name' is not in camel case camelcase + 14:3 error Identifier 'author_url' is not in camel case camelcase + 16:3 error Identifier 'date_gmt' is not in camel case camelcase + 29:3 error Identifier 'author_name' is not in camel case camelcase + 30:3 error Identifier 'author_url' is not in camel case camelcase + 32:3 error Identifier 'date_gmt' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/review-replies/test/handlers.js + 32:1 error 'state/action-types' import is duplicated no-duplicate-imports + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/reviews/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/reviews/handlers.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 87:55 error 'getState' is defined but never used no-unused-vars + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/reviews/reducer.js + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/reviews/selectors.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/reviews/test/fixtures/review.js + 9:2 error Identifier 'product_id' is not in camel case camelcase + 10:2 error Identifier 'date_created' is not in camel case camelcase + 11:2 error Identifier 'date_created_gmt' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/reviews/test/fixtures/reviews.js + 10:3 error Identifier 'product_id' is not in camel case camelcase + 11:3 error Identifier 'date_created' is not in camel case camelcase + 12:3 error Identifier 'date_created_gmt' is not in camel case camelcase + 22:3 error Identifier 'product_id' is not in camel case camelcase + 23:3 error Identifier 'date_created' is not in camel case camelcase + 24:3 error Identifier 'date_created_gmt' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/reviews/test/handlers.js + 26:1 error 'state/action-types' import is duplicated no-duplicate-imports + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 139:1 error Line 139 exceeds the maximum line length of 100 max-len + 184:1 error Line 184 exceeds the maximum line length of 100 max-len + 212:1 error Line 212 exceeds the maximum line length of 100 max-len + 230:1 error Line 230 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/reviews/test/reducer.js + 286:1 error Line 286 exceeds the maximum line length of 100 max-len + 300:1 error Line 300 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/reviews/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:2 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 53:4 error Identifier 'group_id' is not in camel case camelcase + 58:4 error Identifier 'group_id' is not in camel case camelcase + 63:4 error Identifier 'group_id' is not in camel case camelcase + 68:4 error Identifier 'group_id' is not in camel case camelcase + 73:4 error Identifier 'group_id' is not in camel case camelcase + 78:4 error Identifier 'group_id' is not in camel case camelcase + 83:4 error Identifier 'group_id' is not in camel case camelcase + 88:4 error Identifier 'group_id' is not in camel case camelcase + 93:4 error Identifier 'group_id' is not in camel case camelcase + 98:4 error Identifier 'group_id' is not in camel case camelcase + 103:4 error Identifier 'group_id' is not in camel case camelcase + 108:4 error Identifier 'group_id' is not in camel case camelcase + 113:4 error Identifier 'group_id' is not in camel case camelcase + 170:4 error Identifier 'group_id' is not in camel case camelcase + 175:4 error Identifier 'group_id' is not in camel case camelcase + 180:4 error Identifier 'group_id' is not in camel case camelcase + 185:4 error Identifier 'group_id' is not in camel case camelcase + 190:4 error Identifier 'group_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/email/actions.js + 212:55 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 306:10 error Identifier 'sync_status' is not in camel case camelcase + 328:10 error Identifier 'sync_status' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/email/reducer.js + 53:19 error Identifier 'mailchimp_lists' is not in camel case camelcase + 59:10 error Identifier 'mailchimp_list' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/email/test/actions.js + 46:7 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 47:7 error Identifier 'mailchimp_debugging' is not in camel case camelcase + 48:7 error Identifier 'mailchimp_account_info_id' is not in camel case camelcase + 49:7 error Identifier 'mailchimp_account_info_username' is not in camel case camelcase + 50:7 error Identifier 'active_tab' is not in camel case camelcase + 51:7 error Identifier 'store_name' is not in camel case camelcase + 52:7 error Identifier 'campaign_from_name' is not in camel case camelcase + 53:7 error Identifier 'campaign_from_email' is not in camel case camelcase + 54:7 error Identifier 'campaign_subject' is not in camel case camelcase + 55:7 error Identifier 'campaign_language' is not in camel case camelcase + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 56:7 error Identifier 'campaign_permission_reminder' is not in camel case camelcase + 57:7 error Identifier 'mailchimp_list' is not in camel case camelcase + 58:7 error Identifier 'newsletter_label' is not in camel case camelcase + 59:7 error Identifier 'mailchimp_active_tab' is not in camel case camelcase + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 84:7 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 85:7 error Identifier 'mailchimp_debugging' is not in camel case camelcase + 86:7 error Identifier 'mailchimp_account_info_id' is not in camel case camelcase + 87:7 error Identifier 'mailchimp_account_info_username' is not in camel case camelcase + 88:7 error Identifier 'active_tab' is not in camel case camelcase + 89:7 error Identifier 'store_name' is not in camel case camelcase + 90:7 error Identifier 'campaign_from_name' is not in camel case camelcase + 91:7 error Identifier 'campaign_from_email' is not in camel case camelcase + 92:7 error Identifier 'campaign_subject' is not in camel case camelcase + 93:7 error Identifier 'campaign_language' is not in camel case camelcase + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + 94:7 error Identifier 'campaign_permission_reminder' is not in camel case camelcase + 95:7 error Identifier 'mailchimp_list' is not in camel case camelcase + 96:7 error Identifier 'newsletter_label' is not in camel case camelcase + 97:7 error Identifier 'mailchimp_active_tab' is not in camel case camelcase + 114:7 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 115:7 error Identifier 'mailchimp_debugging' is not in camel case camelcase + 116:7 error Identifier 'mailchimp_account_info_id' is not in camel case camelcase + 117:7 error Identifier 'mailchimp_account_info_username' is not in camel case camelcase + 118:7 error Identifier 'mailchimp_active_tab' is not in camel case camelcase + 126:10 error Identifier 'api_key' is not in camel case camelcase + 134:1 error Line 134 exceeds the maximum line length of 100 max-len + 137:10 error Identifier 'api_key' is not in camel case camelcase + 145:7 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 146:7 error Identifier 'mailchimp_debugging' is not in camel case camelcase + 147:7 error Identifier 'mailchimp_account_info_id' is not in camel case camelcase + 148:7 error Identifier 'mailchimp_account_info_username' is not in camel case camelcase + 149:7 error Identifier 'mailchimp_active_tab' is not in camel case camelcase + 166:7 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 167:7 error Identifier 'mailchimp_debugging' is not in camel case camelcase + 168:7 error Identifier 'mailchimp_account_info_id' is not in camel case camelcase + 169:7 error Identifier 'mailchimp_account_info_username' is not in camel case camelcase + 170:7 error Identifier 'mailchimp_active_tab' is not in camel case camelcase + 171:7 error Identifier 'store_name' is not in camel case camelcase + 172:7 error Identifier 'store_street' is not in camel case camelcase + 173:7 error Identifier 'store_city' is not in camel case camelcase + 181:24 error Identifier 'store_name' is not in camel case camelcase + 189:1 error Line 189 exceeds the maximum line length of 100 max-len + 193:5 error Identifier 'store_name' is not in camel case camelcase + 194:5 error Identifier 'store_street' is not in camel case camelcase + 195:5 error Identifier 'store_city' is not in camel case camelcase + 204:7 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 205:7 error Identifier 'mailchimp_debugging' is not in camel case camelcase + 206:7 error Identifier 'mailchimp_account_info_id' is not in camel case camelcase + 207:7 error Identifier 'mailchimp_account_info_username' is not in camel case camelcase + 208:7 error Identifier 'mailchimp_active_tab' is not in camel case camelcase + 209:7 error Identifier 'store_name' is not in camel case camelcase + 210:7 error Identifier 'store_street' is not in camel case camelcase + 211:7 error Identifier 'store_city' is not in camel case camelcase + 228:7 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 229:7 error Identifier 'mailchimp_debugging' is not in camel case camelcase + 230:7 error Identifier 'mailchimp_account_info_id' is not in camel case camelcase + 231:7 error Identifier 'mailchimp_account_info_username' is not in camel case camelcase + 232:7 error Identifier 'mailchimp_active_tab' is not in camel case camelcase + 233:7 error Identifier 'store_name' is not in camel case camelcase + 234:7 error Identifier 'store_street' is not in camel case camelcase + 235:7 error Identifier 'store_city' is not in camel case camelcase + 236:7 error Identifier 'campaign_from_name' is not in camel case camelcase + 237:7 error Identifier 'campaign_from_email' is not in camel case camelcase + 246:5 error Identifier 'campaign_from_name' is not in camel case camelcase + 247:5 error Identifier 'campaign_from_email' is not in camel case camelcase + 256:1 error Line 256 exceeds the maximum line length of 100 max-len + 260:5 error Identifier 'campaign_from_name' is not in camel case camelcase + 261:5 error Identifier 'campaign_from_email' is not in camel case camelcase + 273:7 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 274:7 error Identifier 'mailchimp_debugging' is not in camel case camelcase + 275:7 error Identifier 'mailchimp_account_info_id' is not in camel case camelcase + 276:7 error Identifier 'mailchimp_account_info_username' is not in camel case camelcase + 277:7 error Identifier 'mailchimp_active_tab' is not in camel case camelcase + 278:7 error Identifier 'store_name' is not in camel case camelcase + 279:7 error Identifier 'store_street' is not in camel case camelcase + 280:7 error Identifier 'store_city' is not in camel case camelcase + 281:7 error Identifier 'campaign_from_name' is not in camel case camelcase + 282:7 error Identifier 'campaign_from_email' is not in camel case camelcase + 299:7 error Identifier 'last_updated_time' is not in camel case camelcase + 300:7 error Identifier 'store_syncing' is not in camel case camelcase + 301:7 error Identifier 'mailchimp_total_products' is not in camel case camelcase + 302:7 error Identifier 'product_count' is not in camel case camelcase + 303:7 error Identifier 'mailchimp_total_orders' is not in camel case camelcase + 304:7 error Identifier 'order_count' is not in camel case camelcase + 305:7 error Identifier 'account_name' is not in camel case camelcase + 306:7 error Identifier 'mailchimp_list_name' is not in camel case camelcase + 307:7 error Identifier 'store_id' is not in camel case camelcase + 322:1 error Line 322 exceeds the maximum line length of 100 max-len + 332:7 error Identifier 'last_updated_time' is not in camel case camelcase + 333:7 error Identifier 'store_syncing' is not in camel case camelcase + 334:7 error Identifier 'mailchimp_total_products' is not in camel case camelcase + 335:7 error Identifier 'product_count' is not in camel case camelcase + 336:7 error Identifier 'mailchimp_total_orders' is not in camel case camelcase + 337:7 error Identifier 'order_count' is not in camel case camelcase + 338:7 error Identifier 'account_name' is not in camel case camelcase + 339:7 error Identifier 'mailchimp_list_name' is not in camel case camelcase + 340:7 error Identifier 'store_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/email/test/reducer.js + 38:22 error Identifier 'store_name' is not in camel case camelcase + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 52:22 error Identifier 'store_name' is not in camel case camelcase + 67:4 error Identifier 'store_name' is not in camel case camelcase + 68:4 error Identifier 'mailchimp_lists' is not in camel case camelcase + 72:4 error Identifier 'mailchimp_list' is not in camel case camelcase + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 84:22 error Identifier 'store_name' is not in camel case camelcase + 84:45 error Identifier 'mailchimp_list' is not in camel case camelcase + 99:4 error Identifier 'store_name' is not in camel case camelcase + 100:4 error Identifier 'mailchimp_lists' is not in camel case camelcase + 104:4 error Identifier 'mailchimp_list' is not in camel case camelcase + 116:22 error Identifier 'store_name' is not in camel case camelcase + 116:45 error Identifier 'mailchimp_list' is not in camel case camelcase + 163:16 error Identifier 'store_name' is not in camel case camelcase + 210:16 error Identifier 'mailchimp_list' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/email/test/selectors.js + 23:2 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 24:2 error Identifier 'mailchimp_debugging' is not in camel case camelcase + 25:2 error Identifier 'mailchimp_account_info_id' is not in camel case camelcase + 26:2 error Identifier 'mailchimp_account_info_username' is not in camel case camelcase + 27:2 error Identifier 'active_tab' is not in camel case camelcase + 28:2 error Identifier 'store_name' is not in camel case camelcase + 29:2 error Identifier 'store_street' is not in camel case camelcase + 30:2 error Identifier 'store_city' is not in camel case camelcase + 31:2 error Identifier 'store_state' is not in camel case camelcase + 32:2 error Identifier 'store_postal_code' is not in camel case camelcase + 33:2 error Identifier 'store_country' is not in camel case camelcase + 34:2 error Identifier 'store_phone' is not in camel case camelcase + 35:2 error Identifier 'store_locale' is not in camel case camelcase + 36:2 error Identifier 'store_timezone' is not in camel case camelcase + 37:2 error Identifier 'store_currency_code' is not in camel case camelcase + 38:2 error Identifier 'admin_email' is not in camel case camelcase + 39:2 error Identifier 'campaign_from_name' is not in camel case camelcase + 40:2 error Identifier 'campaign_from_email' is not in camel case camelcase + 41:2 error Identifier 'campaign_subject' is not in camel case camelcase + 42:2 error Identifier 'campaign_language' is not in camel case camelcase + 43:2 error Identifier 'campaign_permission_reminder' is not in camel case camelcase + 44:2 error Identifier 'mailchimp_list' is not in camel case camelcase + 45:2 error Identifier 'newsletter_label' is not in camel case camelcase + 46:2 error Identifier 'mailchimp_auto_subscribe' is not in camel case camelcase + 47:2 error Identifier 'mailchimp_checkbox_defaults' is not in camel case camelcase + 48:2 error Identifier 'mailchimp_checkbox_action' is not in camel case camelcase + 49:2 error Identifier 'mailchimp_active_tab' is not in camel case camelcase + 53:2 error Identifier 'mailchimp_api_key' is not in camel case camelcase + 54:2 error Identifier 'mailchimp_debugging' is not in camel case camelcase + 55:2 error Identifier 'mailchimp_account_info_id' is not in camel case camelcase + 56:2 error Identifier 'mailchimp_account_info_username' is not in camel case camelcase + 70:9 error Identifier 'last_updated_time' is not in camel case camelcase + 71:9 error Identifier 'store_syncing' is not in camel case camelcase + 72:9 error Identifier 'mailchimp_total_products' is not in camel case camelcase + 73:9 error Identifier 'product_count' is not in camel case camelcase + 74:9 error Identifier 'mailchimp_total_orders' is not in camel case camelcase + 75:9 error Identifier 'order_count' is not in camel case camelcase + 76:9 error Identifier 'account_name' is not in camel case camelcase + 77:9 error Identifier 'mailchimp_list_name' is not in camel case camelcase + 78:9 error Identifier 'store_id' is not in camel case camelcase + 135:47 error Identifier 'mailchimp_list_name' is not in camel case camelcase + 167:1 error Line 167 exceeds the maximum line length of 100 max-len + 201:1 error Line 201 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/general/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/general/handlers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/general/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/general/selectors.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/general/test/handlers.js + 29:3 error Unquoted reserved word 'default' used as key quote-props + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/general/test/reducer.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 45:6 error Unquoted reserved word 'default' used as key quote-props + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 100:5 error Identifier 'group_id' is not in camel case camelcase + 105:5 error Identifier 'group_id' is not in camel case camelcase + 110:5 error Identifier 'group_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/general/test/selectors.js + 48:2 error Unquoted reserved word 'default' used as key quote-props + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/helpers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/products/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/products/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/products/selectors.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/products/test/actions.js + 36:8 error Unquoted reserved word 'default' used as key quote-props + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 70:8 error Unquoted reserved word 'default' used as key quote-props + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/products/test/reducer.js + 55:4 error Identifier 'group_id' is not in camel case camelcase + 60:4 error Identifier 'group_id' is not in camel case camelcase + 65:4 error Identifier 'group_id' is not in camel case camelcase + 70:4 error Identifier 'group_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/products/test/selectors.js + 49:2 error Unquoted reserved word 'default' used as key quote-props + 56:2 error Unquoted reserved word 'default' used as key quote-props + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + 112:1 error Line 112 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/stripe-connect-account/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/stripe-connect-account/handlers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 32:10 error Identifier 'account_id' is not in camel case camelcase + 36:20 error Identifier 'account_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/stripe-connect-account/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/stripe-connect-account/test/handlers.js + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 56:6 error Identifier 'account_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/settings/tax/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/setup-choices/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/setup-choices/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/setup-choices/selectors.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/setup-choices/test/actions.js + 43:6 error Identifier 'finished_initial_setup' is not in camel case camelcase + 44:6 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 45:6 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 46:6 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 47:6 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 48:6 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 49:6 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 73:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 74:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 75:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 76:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 77:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 78:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 79:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 110:6 error Identifier 'finished_initial_setup' is not in camel case camelcase + 113:6 error Identifier 'finished_initial_setup' is not in camel case camelcase + 114:6 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 115:6 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 116:6 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 117:6 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 118:6 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 119:6 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 145:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 146:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 147:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 148:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 149:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 150:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 151:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 165:6 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 168:6 error Identifier 'finished_initial_setup' is not in camel case camelcase + 169:6 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 170:6 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 171:6 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 172:6 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 173:6 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 174:6 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 200:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 201:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 202:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 203:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 204:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 205:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 206:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 220:6 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 223:6 error Identifier 'finished_initial_setup' is not in camel case camelcase + 224:6 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 225:6 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 226:6 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 227:6 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 228:6 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 229:6 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 255:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 256:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 257:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 258:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 259:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 260:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 261:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 275:6 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 278:6 error Identifier 'finished_initial_setup' is not in camel case camelcase + 279:6 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 280:6 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 281:6 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 282:6 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 283:6 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 284:6 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 303:1 error Line 303 exceeds the maximum line length of 100 max-len + 310:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 311:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 312:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 313:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 314:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 315:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 316:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 330:6 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 333:6 error Identifier 'finished_initial_setup' is not in camel case camelcase + 334:6 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 335:6 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 336:6 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 337:6 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 338:6 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 339:6 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 365:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 366:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 367:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 368:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 369:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 370:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 371:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 385:6 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 388:6 error Identifier 'finished_initial_setup' is not in camel case camelcase + 389:6 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 390:6 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 391:6 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 392:6 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 393:6 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 394:6 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 413:1 error Line 413 exceeds the maximum line length of 100 max-len + 420:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 421:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 422:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 423:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 424:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 425:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 426:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 449:1 error Line 449 exceeds the maximum line length of 100 max-len + 486:6 error Identifier 'checked_tax_setup' is not in camel case camelcase + 489:6 error Identifier 'finished_initial_setup' is not in camel case camelcase + 490:6 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 491:6 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 492:6 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 493:6 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 494:6 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 495:6 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 496:6 error Identifier 'checked_tax_setup' is not in camel case camelcase + 522:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 523:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 524:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 525:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 526:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 527:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 528:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 529:7 error Identifier 'checked_tax_setup' is not in camel case camelcase + 543:6 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 546:6 error Identifier 'finished_initial_setup' is not in camel case camelcase + 547:6 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 548:6 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 549:6 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 550:6 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 551:6 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 552:6 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 571:1 error Line 571 exceeds the maximum line length of 100 max-len + 578:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 579:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 580:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 581:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 582:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 583:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 584:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/setup-choices/test/reducer.js + 37:5 error Identifier 'finished_initial_setup' is not in camel case camelcase + 38:5 error Identifier 'finished_page_setup' is not in camel case camelcase + 39:5 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 40:5 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 41:5 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 42:5 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 43:5 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 44:5 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 62:5 error Identifier 'finished_initial_setup' is not in camel case camelcase + 63:5 error Identifier 'finished_page_setup' is not in camel case camelcase + 64:5 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 65:5 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 66:5 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 67:5 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 68:5 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 69:5 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/setup-choices/test/selectors.js + 48:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 49:7 error Identifier 'finished_page_setup' is not in camel case camelcase + 50:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 51:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 52:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 53:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 54:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 55:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 56:7 error Identifier 'checked_tax_setup' is not in camel case camelcase + 61:7 error Identifier 'finished_initial_setup' is not in camel case camelcase + 62:7 error Identifier 'finished_page_setup' is not in camel case camelcase + 63:7 error Identifier 'opted_out_of_shipping_setup' is not in camel case camelcase + 64:7 error Identifier 'opted_out_of_taxes_setup' is not in camel case camelcase + 65:7 error Identifier 'tried_customizer_during_initial_setup' is not in camel case camelcase + 66:7 error Identifier 'created_default_shipping_zone' is not in camel case camelcase + 67:7 error Identifier 'finished_initial_install_of_required_plugins' is not in camel case camelcase + 68:7 error Identifier 'set_store_address_during_initial_setup' is not in camel case camelcase + 69:7 error Identifier 'checked_tax_setup' is not in camel case camelcase + 224:1 error Line 224 exceeds the maximum line length of 100 max-len + 228:1 error Line 228 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-methods/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-methods/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-methods/selectors.js + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-methods/test/reducer.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zone-locations/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zone-locations/helpers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:1 error Line 11 exceeds the maximum line length of 100 max-len + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zone-locations/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zone-locations/selectors.js + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 111:1 error Line 111 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zone-locations/test/selectors.js + 83:1 error Line 83 exceeds the maximum line length of 100 max-len + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + 109:1 error Line 109 exceeds the maximum line length of 100 max-len + 113:1 error Line 113 exceeds the maximum line length of 100 max-len + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + 387:1 error Line 387 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zone-methods/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zone-methods/reducer.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zone-methods/selectors.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zone-methods/test/reducer.js + 48:5 error Identifier 'method_id' is not in camel case camelcase + 57:5 error Identifier 'method_id' is not in camel case camelcase + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + 93:28 error Identifier 'method_id' is not in camel case camelcase + 94:29 error Identifier 'method_id' is not in camel case camelcase + 103:1 error Line 103 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zone-methods/test/selectors.js + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zones/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zones/selectors.js + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zones/test/actions.js + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/shipping-zones/test/selectors.js + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + 124:1 error Line 124 exceeds the maximum line length of 100 max-len + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 129:1 error Line 129 exceeds the maximum line length of 100 max-len + 130:1 error Line 130 exceeds the maximum line length of 100 max-len + 133:1 error Line 133 exceeds the maximum line length of 100 max-len + 134:1 error Line 134 exceeds the maximum line length of 100 max-len + 159:1 error Line 159 exceeds the maximum line length of 100 max-len + 160:1 error Line 160 exceeds the maximum line length of 100 max-len + 163:1 error Line 163 exceeds the maximum line length of 100 max-len + 168:1 error Line 168 exceeds the maximum line length of 100 max-len + 169:1 error Line 169 exceeds the maximum line length of 100 max-len + 172:1 error Line 172 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/status/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/status/wc-api/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/status/wc-api/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/status/wc-api/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/sites/test/http-request.js + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/test/helpers/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/helpers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/orders/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/orders/edits/test/reducer.js + 27:6 error Identifier 'first_name' is not in camel case camelcase + 36:6 error Identifier 'first_name' is not in camel case camelcase + 49:6 error Identifier 'first_name' is not in camel case camelcase + 50:6 error Identifier 'last_name' is not in camel case camelcase + 58:6 error Identifier 'first_name' is not in camel case camelcase + 67:6 error Identifier 'first_name' is not in camel case camelcase + 68:6 error Identifier 'last_name' is not in camel case camelcase + 81:6 error Identifier 'last_name' is not in camel case camelcase + 89:6 error Identifier 'first_name' is not in camel case camelcase + 98:6 error Identifier 'first_name' is not in camel case camelcase + 99:6 error Identifier 'last_name' is not in camel case camelcase + 111:6 error Identifier 'first_name' is not in camel case camelcase + 119:5 error Identifier 'first_name' is not in camel case camelcase + 131:6 error Identifier 'last_name' is not in camel case camelcase + 139:6 error Identifier 'first_name' is not in camel case camelcase + 148:6 error Identifier 'first_name' is not in camel case camelcase + 149:6 error Identifier 'last_name' is not in camel case camelcase + 164:6 error Identifier 'first_name' is not in camel case camelcase + 186:6 error Identifier 'first_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/orders/list/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/orders/selectors.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/orders/test/actions.js + 42:5 error Identifier 'first_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/orders/test/fixtures/detailed-state.js + 7:2 error Identifier 'total_tax' is not in camel case camelcase + 8:2 error Identifier 'prices_include_tax' is not in camel case camelcase + 10:3 error Identifier 'first_name' is not in camel case camelcase + 11:3 error Identifier 'last_name' is not in camel case camelcase + 13:3 error Identifier 'address_1' is not in camel case camelcase + 14:3 error Identifier 'address_2' is not in camel case camelcase + 23:3 error Identifier 'first_name' is not in camel case camelcase + 24:3 error Identifier 'last_name' is not in camel case camelcase + 26:3 error Identifier 'address_1' is not in camel case camelcase + 27:3 error Identifier 'address_2' is not in camel case camelcase + 33:2 error Identifier 'payment_method' is not in camel case camelcase + 34:2 error Identifier 'payment_method_title' is not in camel case camelcase + 35:2 error Identifier 'meta_data' is not in camel case camelcase + 36:2 error Identifier 'line_items' is not in camel case camelcase + 43:2 error Identifier 'tax_lines' is not in camel case camelcase + 44:2 error Identifier 'shipping_lines' is not in camel case camelcase + 47:4 error Identifier 'method_title' is not in camel case camelcase + 48:4 error Identifier 'method_id' is not in camel case camelcase + 50:4 error Identifier 'total_tax' is not in camel case camelcase + 79:10 error Identifier 'first_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/orders/test/reducer.js + 20:46 error Identifier 'first_name' is not in camel case camelcase + 38:48 error Identifier 'first_name' is not in camel case camelcase + 54:5 error Identifier 'first_name' is not in camel case camelcase + 61:48 error Identifier 'first_name' is not in camel case camelcase + 65:48 error Identifier 'first_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/orders/test/selectors.js + 92:63 error Identifier 'first_name' is not in camel case camelcase + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 104:58 error Identifier 'first_name' is not in camel case camelcase + 114:65 error Identifier 'first_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/payments/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/payments/currency/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/payments/currency/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/payments/currency/selectors.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/payments/methods/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/payments/methods/selectors.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 149:1 error Line 149 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/payments/methods/test/reducer.js + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 93:1 error Line 93 exceeds the maximum line length of 100 max-len + 111:1 error Line 111 exceeds the maximum line length of 100 max-len + 177:1 error Line 177 exceeds the maximum line length of 100 max-len + 180:1 error Line 180 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/payments/methods/test/selectors.js + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 114:1 error Line 114 exceeds the maximum line length of 100 max-len + 157:1 error Line 157 exceeds the maximum line length of 100 max-len + 175:1 error Line 175 exceeds the maximum line length of 100 max-len + 181:1 error Line 181 exceeds the maximum line length of 100 max-len + 193:1 error Line 193 exceeds the maximum line length of 100 max-len + 219:1 error Line 219 exceeds the maximum line length of 100 max-len + 279:2 error Test suite title is used multiple times jest/no-identical-title + 280:1 error Line 280 exceeds the maximum line length of 100 max-len + 291:1 error Line 291 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/payments/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/product-categories/actions.js + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/product-categories/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/product-categories/selectors.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/product-categories/test/edits-reducer.js + 157:1 error Line 157 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/product-categories/test/selectors.js + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + 118:1 error Line 118 exceeds the maximum line length of 100 max-len + 119:1 error Line 119 exceeds the maximum line length of 100 max-len + 122:1 error Line 122 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/selectors.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + 83:1 error Line 83 exceeds the maximum line length of 100 max-len + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + 122:1 error Line 122 exceeds the maximum line length of 100 max-len + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + 152:1 error Line 152 exceeds the maximum line length of 100 max-len + 176:1 error Line 176 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/test/edits-reducer.js + 322:1 error Line 322 exceeds the maximum line length of 100 max-len + 330:1 error Line 330 exceeds the maximum line length of 100 max-len + 367:1 error Line 367 exceeds the maximum line length of 100 max-len + 368:1 error Line 368 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/test/selectors.js + 233:1 error Line 233 exceeds the maximum line length of 100 max-len + 296:1 error Line 296 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/variations/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/variations/edits-reducer.js + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 167:1 error Line 167 exceeds the maximum line length of 100 max-len + 172:1 error Line 172 exceeds the maximum line length of 100 max-len + 173:1 error Line 173 exceeds the maximum line length of 100 max-len + 196:1 error Line 196 exceeds the maximum line length of 100 max-len + 240:1 error Line 240 exceeds the maximum line length of 100 max-len + 295:1 error Line 295 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/variations/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/variations/selectors.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 97:1 error Line 97 exceeds the maximum line length of 100 max-len + 113:1 error Line 113 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/variations/test/edits-reducer.js + 90:31 error Identifier 'regular_price' is not in camel case camelcase + 93:56 error Identifier 'regular_price' is not in camel case camelcase + 100:55 error Identifier 'regular_price' is not in camel case camelcase + 105:29 error Identifier 'regular_price' is not in camel case camelcase + 108:56 error Identifier 'regular_price' is not in camel case camelcase + 114:56 error Identifier 'regular_price' is not in camel case camelcase + 117:56 error Identifier 'regular_price' is not in camel case camelcase + 124:4 error Identifier 'regular_price' is not in camel case camelcase + 129:4 error Identifier 'regular_price' is not in camel case camelcase + 135:57 error Identifier 'regular_price' is not in camel case camelcase + 140:57 error Identifier 'regular_price' is not in camel case camelcase + 143:56 error Identifier 'regular_price' is not in camel case camelcase + 144:56 error Identifier 'regular_price' is not in camel case camelcase + 152:51 error Identifier 'regular_price' is not in camel case camelcase + 167:51 error Identifier 'regular_price' is not in camel case camelcase + 173:56 error Identifier 'regular_price' is not in camel case camelcase + 184:51 error Identifier 'regular_price' is not in camel case camelcase + 188:51 error Identifier 'regular_price' is not in camel case camelcase + 202:52 error Identifier 'regular_price' is not in camel case camelcase + 206:52 error Identifier 'regular_price' is not in camel case camelcase + 220:51 error Identifier 'regular_price' is not in camel case camelcase + 232:51 error Identifier 'regular_price' is not in camel case camelcase + 247:4 error Identifier 'regular_price' is not in camel case camelcase + 253:57 error Identifier 'regular_price' is not in camel case camelcase + 391:1 error Line 391 exceeds the maximum line length of 100 max-len + 392:1 error Line 392 exceeds the maximum line length of 100 max-len + 395:1 error Line 395 exceeds the maximum line length of 100 max-len + 441:1 error Line 441 exceeds the maximum line length of 100 max-len + 449:8 error Identifier 'regular_price' is not in camel case camelcase + 576:1 error Line 576 exceeds the maximum line length of 100 max-len + 609:1 error Line 609 exceeds the maximum line length of 100 max-len + 647:1 error Line 647 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/products/variations/test/selectors.js + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 122:1 error Line 122 exceeds the maximum line length of 100 max-len + 133:1 error Line 133 exceeds the maximum line length of 100 max-len + 153:1 error Line 153 exceeds the maximum line length of 100 max-len + 178:1 error Line 178 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/review-replies/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/review-replies/selectors.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/reviews/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/reviews/list/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/reviews/list/test/reducer.js + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/reviews/selectors.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/reviews/test/selectors.js + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/locations/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/locations/helpers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:1 error Line 11 exceeds the maximum line length of 100 max-len + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/locations/reducer.js + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/locations/selectors.js + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + 93:1 error Line 93 exceeds the maximum line length of 100 max-len + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + 132:1 error Line 132 exceeds the maximum line length of 100 max-len + 134:1 error Line 134 exceeds the maximum line length of 100 max-len + 151:1 error Line 151 exceeds the maximum line length of 100 max-len + 177:1 error Line 177 exceeds the maximum line length of 100 max-len + 178:1 error Line 178 exceeds the maximum line length of 100 max-len + 180:1 error Line 180 exceeds the maximum line length of 100 max-len + 181:1 error Line 181 exceeds the maximum line length of 100 max-len + 226:1 error Line 226 exceeds the maximum line length of 100 max-len + 247:1 error Line 247 exceeds the maximum line length of 100 max-len + 271:1 error Line 271 exceeds the maximum line length of 100 max-len + 288:1 error Line 288 exceeds the maximum line length of 100 max-len + 322:1 error Line 322 exceeds the maximum line length of 100 max-len + 339:1 error Line 339 exceeds the maximum line length of 100 max-len + 340:1 error Line 340 exceeds the maximum line length of 100 max-len + 353:1 error Line 353 exceeds the maximum line length of 100 max-len + 354:1 error Line 354 exceeds the maximum line length of 100 max-len + 355:1 error Line 355 exceeds the maximum line length of 100 max-len + 371:1 error Line 371 exceeds the maximum line length of 100 max-len + 372:1 error Line 372 exceeds the maximum line length of 100 max-len + 386:1 error Line 386 exceeds the maximum line length of 100 max-len + 428:1 error Line 428 exceeds the maximum line length of 100 max-len + 474:1 error Line 474 exceeds the maximum line length of 100 max-len + 488:1 error Line 488 exceeds the maximum line length of 100 max-len + 489:1 error Line 489 exceeds the maximum line length of 100 max-len + 491:1 error Line 491 exceeds the maximum line length of 100 max-len + 586:1 error Line 586 exceeds the maximum line length of 100 max-len + 588:1 error Line 588 exceeds the maximum line length of 100 max-len + 589:1 error Line 589 exceeds the maximum line length of 100 max-len + 607:1 error Line 607 exceeds the maximum line length of 100 max-len + 609:1 error Line 609 exceeds the maximum line length of 100 max-len + 610:1 error Line 610 exceeds the maximum line length of 100 max-len + 628:1 error Line 628 exceeds the maximum line length of 100 max-len + 629:1 error Line 629 exceeds the maximum line length of 100 max-len + 630:1 error Line 630 exceeds the maximum line length of 100 max-len + 635:1 error Line 635 exceeds the maximum line length of 100 max-len + 636:1 error Line 636 exceeds the maximum line length of 100 max-len + 652:1 error Line 652 exceeds the maximum line length of 100 max-len + 675:1 error Line 675 exceeds the maximum line length of 100 max-len + 695:1 error Line 695 exceeds the maximum line length of 100 max-len + 697:1 error Line 697 exceeds the maximum line length of 100 max-len + 701:1 error Line 701 exceeds the maximum line length of 100 max-len + 702:1 error Line 702 exceeds the maximum line length of 100 max-len + 736:1 error Line 736 exceeds the maximum line length of 100 max-len + 737:1 error Line 737 exceeds the maximum line length of 100 max-len + 762:1 error Line 762 exceeds the maximum line length of 100 max-len + 763:1 error Line 763 exceeds the maximum line length of 100 max-len + 782:1 error Line 782 exceeds the maximum line length of 100 max-len + 783:1 error Line 783 exceeds the maximum line length of 100 max-len + 786:1 error Line 786 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/locations/test/helpers.js + 158:1 error Line 158 exceeds the maximum line length of 100 max-len + 165:1 error Line 165 exceeds the maximum line length of 100 max-len + 187:1 error Line 187 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/locations/test/reducer.js + 389:1 error Line 389 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/locations/test/selectors.js + 140:1 error Line 140 exceeds the maximum line length of 100 max-len + 157:3 error Test title is used multiple times in the same test suite jest/no-identical-title + 262:1 error Line 262 exceeds the maximum line length of 100 max-len + 320:1 error Line 320 exceeds the maximum line length of 100 max-len + 404:1 error Line 404 exceeds the maximum line length of 100 max-len + 430:1 error Line 430 exceeds the maximum line length of 100 max-len + 497:1 error Line 497 exceeds the maximum line length of 100 max-len + 533:1 error Line 533 exceeds the maximum line length of 100 max-len + 559:1 error Line 559 exceeds the maximum line length of 100 max-len + 606:1 error Line 606 exceeds the maximum line length of 100 max-len + 623:1 error Line 623 exceeds the maximum line length of 100 max-len + 649:1 error Line 649 exceeds the maximum line length of 100 max-len + 795:1 error Line 795 exceeds the maximum line length of 100 max-len + 821:1 error Line 821 exceeds the maximum line length of 100 max-len + 917:1 error Line 917 exceeds the maximum line length of 100 max-len + 1056:1 error Line 1056 exceeds the maximum line length of 100 max-len + 1095:1 error Line 1095 exceeds the maximum line length of 100 max-len + 1125:1 error Line 1125 exceeds the maximum line length of 100 max-len + 1238:1 error Line 1238 exceeds the maximum line length of 100 max-len + 1270:1 error Line 1270 exceeds the maximum line length of 100 max-len + 1286:1 error Line 1286 exceeds the maximum line length of 100 max-len + 1302:1 error Line 1302 exceeds the maximum line length of 100 max-len + 1392:1 error Line 1392 exceeds the maximum line length of 100 max-len + 1425:1 error Line 1425 exceeds the maximum line length of 100 max-len + 1458:1 error Line 1458 exceeds the maximum line length of 100 max-len + 1486:1 error Line 1486 exceeds the maximum line length of 100 max-len + 1526:1 error Line 1526 exceeds the maximum line length of 100 max-len + 1624:1 error Line 1624 exceeds the maximum line length of 100 max-len + 1657:1 error Line 1657 exceeds the maximum line length of 100 max-len + 1681:1 error Line 1681 exceeds the maximum line length of 100 max-len + 1733:1 error Line 1733 exceeds the maximum line length of 100 max-len + 1843:1 error Line 1843 exceeds the maximum line length of 100 max-len + 1876:1 error Line 1876 exceeds the maximum line length of 100 max-len + 1941:1 error Line 1941 exceeds the maximum line length of 100 max-len + 1968:1 error Line 1968 exceeds the maximum line length of 100 max-len + 1997:1 error Line 1997 exceeds the maximum line length of 100 max-len + 2028:1 error Line 2028 exceeds the maximum line length of 100 max-len + 2124:1 error Line 2124 exceeds the maximum line length of 100 max-len + 2327:1 error Line 2327 exceeds the maximum line length of 100 max-len + 2349:1 error Line 2349 exceeds the maximum line length of 100 max-len + 2519:1 error Line 2519 exceeds the maximum line length of 100 max-len + 2533:1 error Line 2533 exceeds the maximum line length of 100 max-len + 2576:1 error Line 2576 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/flat-rate/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/flat-rate/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:2 error Identifier 'tax_status' is not in camel case camelcase + 23:3 error Identifier 'tax_status' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/free-shipping/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/free-shipping/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:2 error Identifier 'min_amount' is not in camel case camelcase + 30:3 error Identifier 'min_amount' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/helpers.js + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/local-pickup/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/local-pickup/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:2 error Identifier 'tax_status' is not in camel case camelcase + 23:3 error Identifier 'tax_status' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/reducer.js + 32:2 error Identifier 'flat_rate' is not in camel case camelcase + 33:2 error Identifier 'free_shipping' is not in camel case camelcase + 34:2 error Identifier 'local_pickup' is not in camel case camelcase + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 152:1 error Line 152 exceeds the maximum line length of 100 max-len + 328:1 error Line 328 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/selectors.js + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + 109:1 error Line 109 exceeds the maximum line length of 100 max-len + 127:1 error Line 127 exceeds the maximum line length of 100 max-len + 128:1 error Line 128 exceeds the maximum line length of 100 max-len + 159:1 error Line 159 exceeds the maximum line length of 100 max-len + 160:1 error Line 160 exceeds the maximum line length of 100 max-len + 161:1 error Line 161 exceeds the maximum line length of 100 max-len + 187:1 error Line 187 exceeds the maximum line length of 100 max-len + 228:1 error Line 228 exceeds the maximum line length of 100 max-len + 249:1 error Line 249 exceeds the maximum line length of 100 max-len + 250:1 error Line 250 exceeds the maximum line length of 100 max-len + 292:1 error Line 292 exceeds the maximum line length of 100 max-len + 293:1 error Line 293 exceeds the maximum line length of 100 max-len + 294:1 error Line 294 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/test/reducer.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + 211:1 error Line 211 exceeds the maximum line length of 100 max-len + 230:1 error Line 230 exceeds the maximum line length of 100 max-len + 256:1 error Line 256 exceeds the maximum line length of 100 max-len + 260:1 error Line 260 exceeds the maximum line length of 100 max-len + 281:1 error Line 281 exceeds the maximum line length of 100 max-len + 287:1 error Line 287 exceeds the maximum line length of 100 max-len + 300:1 error Line 300 exceeds the maximum line length of 100 max-len + 336:1 error Line 336 exceeds the maximum line length of 100 max-len + 349:1 error Line 349 exceeds the maximum line length of 100 max-len + 352:1 error Line 352 exceeds the maximum line length of 100 max-len + 368:1 error Line 368 exceeds the maximum line length of 100 max-len + 385:1 error Line 385 exceeds the maximum line length of 100 max-len + 412:1 error Line 412 exceeds the maximum line length of 100 max-len + 430:1 error Line 430 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/methods/test/selectors.js + 198:1 error Line 198 exceeds the maximum line length of 100 max-len + 236:1 error Line 236 exceeds the maximum line length of 100 max-len + 237:1 error Line 237 exceeds the maximum line length of 100 max-len + 255:1 error Line 255 exceeds the maximum line length of 100 max-len + 315:1 error Line 315 exceeds the maximum line length of 100 max-len + 477:1 error Line 477 exceeds the maximum line length of 100 max-len + 521:1 error Line 521 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/reducer.js + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 129:1 error Line 129 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/selectors.js + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 170:1 error Line 170 exceeds the maximum line length of 100 max-len + 171:1 error Line 171 exceeds the maximum line length of 100 max-len + 180:1 error Line 180 exceeds the maximum line length of 100 max-len + 181:1 error Line 181 exceeds the maximum line length of 100 max-len + 190:1 error Line 190 exceeds the maximum line length of 100 max-len + 199:1 error Line 199 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/test/reducer.js + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + 139:1 error Line 139 exceeds the maximum line length of 100 max-len + 240:1 error Line 240 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/state/ui/shipping/zones/test/selectors.js + 248:1 error Line 248 exceeds the maximum line length of 100 max-len + 277:1 error Line 277 exceeds the maximum line length of 100 max-len + 303:1 error Line 303 exceeds the maximum line length of 100 max-len + 343:1 error Line 343 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/store-sidebar/index.js + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 173:1 error Line 173 exceeds the maximum line length of 100 max-len + 235:1 error Line 235 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/components/country-dropdown/index.js + 21:1 error Expected indentation of 2 tabs but found 3 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/components/dropdown/index.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/components/field-error/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/components/labels-setup-notice/index.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/components/query-labels/index.js + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/components/state-dropdown/index.js + 31:1 error Expected indentation of 2 tabs but found 3 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/components/text-field/index.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/lib/initialize-labels-state/index.js + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/lib/pdf-label-utils/index.js + 49:3 error Identifier 'paper_size' is not in camel case camelcase + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 51:3 error Identifier 'label_id_csv' is not in camel case camelcase + 52:3 error Identifier 'caption_csv' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/lib/utils/print-document.js + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 75:1 error Line 75 exceeds the maximum line length of 100 max-len + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/lib/utils/tree.js + 8:1 error Line 8 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/actions.js + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/packages/actions.js + 40:2 error Unquoted reserved word 'package' used as key quote-props + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/packages/reducer.js + 53:28 error Identifier 'is_user_defined' is not in camel case camelcase + 98:15 error Identifier 'box_weight' is not in camel case camelcase + 102:15 error Identifier 'max_weight' is not in camel case camelcase + 118:4 error Identifier 'is_user_defined' is not in camel case camelcase + 271:4 error Identifier 'is_user_defined' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/packages/selectors.js + 250:1 error Line 250 exceeds the maximum line length of 100 max-len + 312:1 error Line 312 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/packages/test/actions.js + 60:4 error Identifier 'is_letter' is not in camel case camelcase + 64:4 error Unquoted reserved word 'package' used as key quote-props + 80:4 error Identifier 'is_letter' is not in camel case camelcase + 96:4 error Identifier 'is_letter' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/packages/test/reducer.js + 78:19 error Identifier 'is_user_defined' is not in camel case camelcase + 122:4 error Identifier 'is_letter' is not in camel case camelcase + 127:4 error Identifier 'max_weight' is not in camel case camelcase + 135:5 error Identifier 'max_weight' is not in camel case camelcase + 136:5 error Identifier 'is_letter' is not in camel case camelcase + 157:4 error Identifier 'is_user_defined' is not in camel case camelcase + 171:4 error Identifier 'is_user_defined' is not in camel case camelcase + 178:4 error Identifier 'is_user_defined' is not in camel case camelcase + 193:4 error Identifier 'is_user_defined' is not in camel case camelcase + 200:4 error Identifier 'is_user_defined' is not in camel case camelcase + 216:4 error Identifier 'is_user_defined' is not in camel case camelcase + 220:4 error Identifier 'is_user_defined' is not in camel case camelcase + 243:1 error Line 243 exceeds the maximum line length of 100 max-len + 291:1 error Line 291 exceeds the maximum line length of 100 max-len + 339:1 error Line 339 exceeds the maximum line length of 100 max-len + 345:1 error Line 345 exceeds the maximum line length of 100 max-len + 357:1 error Line 357 exceeds the maximum line length of 100 max-len + 382:1 error Line 382 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/shipping-label/actions.js + 6:1 error Line 6 exceeds the maximum line length of 100 max-len + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + 136:1 error Line 136 exceeds the maximum line length of 100 max-len + 140:1 error Line 140 exceeds the maximum line length of 100 max-len + 175:1 error Line 175 exceeds the maximum line length of 100 max-len + 199:1 error Line 199 exceeds the maximum line length of 100 max-len + 210:1 error Line 210 exceeds the maximum line length of 100 max-len + 249:1 error Line 249 exceeds the maximum line length of 100 max-len + 315:1 error Line 315 exceeds the maximum line length of 100 max-len + 328:1 error Line 328 exceeds the maximum line length of 100 max-len + 335:1 error Line 335 exceeds the maximum line length of 100 max-len + 343:1 error Line 343 exceeds the maximum line length of 100 max-len + 348:1 error Line 348 exceeds the maximum line length of 100 max-len + 375:1 error Line 375 exceeds the maximum line length of 100 max-len + 492:1 error Line 492 exceeds the maximum line length of 100 max-len + 565:1 error Line 565 exceeds the maximum line length of 100 max-len + 589:1 error Line 589 exceeds the maximum line length of 100 max-len + 603:1 error Line 603 exceeds the maximum line length of 100 max-len + 606:1 error Line 606 exceeds the maximum line length of 100 max-len + 607:1 error Line 607 exceeds the maximum line length of 100 max-len + 624:1 error Line 624 exceeds the maximum line length of 100 max-len + 628:1 error Line 628 exceeds the maximum line length of 100 max-len + 630:1 error Line 630 exceeds the maximum line length of 100 max-len + 633:1 error Line 633 exceeds the maximum line length of 100 max-len + 637:4 error Identifier 'customer_note' is not in camel case camelcase + 657:1 error Line 657 exceeds the maximum line length of 100 max-len + 658:1 error Line 658 exceeds the maximum line length of 100 max-len + 693:1 error Line 693 exceeds the maximum line length of 100 max-len + 708:1 error Line 708 exceeds the maximum line length of 100 max-len + 721:1 error Line 721 exceeds the maximum line length of 100 max-len + 723:1 error Line 723 exceeds the maximum line length of 100 max-len + 723:64 error Identifier 'service_id' is not in camel case camelcase + 726:6 error Identifier 'shipment_id' is not in camel case camelcase + 727:6 error Identifier 'rate_id' is not in camel case camelcase + 728:6 error Identifier 'service_id' is not in camel case camelcase + 729:6 error Identifier 'carrier_id' is not in camel case camelcase + 730:6 error Identifier 'service_name' is not in camel case camelcase + 731:1 error Line 731 exceeds the maximum line length of 100 max-len + 782:1 error Line 782 exceeds the maximum line length of 100 max-len + 813:1 error Line 813 exceeds the maximum line length of 100 max-len + 815:1 error Line 815 exceeds the maximum line length of 100 max-len + 835:1 error Line 835 exceeds the maximum line length of 100 max-len + 843:1 error Line 843 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/shipping-label/get-rates.js + 12:1 error Line 12 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/shipping-label/normalize-address.js + 12:1 error Line 12 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/shipping-label/reducer.js + 4:1 error Line 4 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 138:1 error Line 138 exceeds the maximum line length of 100 max-len + 158:1 error Line 158 exceeds the maximum line length of 100 max-len + 168:1 error Line 168 exceeds the maximum line length of 100 max-len + 183:1 error Line 183 exceeds the maximum line length of 100 max-len + 194:1 error Line 194 exceeds the maximum line length of 100 max-len + 216:1 error Line 216 exceeds the maximum line length of 100 max-len + 233:1 error Line 233 exceeds the maximum line length of 100 max-len + 267:1 error Line 267 exceeds the maximum line length of 100 max-len + 268:1 error Line 268 exceeds the maximum line length of 100 max-len + 293:4 error Identifier 'box_id' is not in camel case camelcase + 303:4 error Identifier 'box_id' is not in camel case camelcase + 353:1 error Line 353 exceeds the maximum line length of 100 max-len + 375:1 error Line 375 exceeds the maximum line length of 100 max-len + 379:1 error Line 379 exceeds the maximum line length of 100 max-len + 397:1 error Line 397 exceeds the maximum line length of 100 max-len + 414:3 error Identifier 'box_id' is not in camel case camelcase + 470:1 error Line 470 exceeds the maximum line length of 100 max-len + 488:4 error Identifier 'box_id' is not in camel case camelcase + 498:4 error Identifier 'box_id' is not in camel case camelcase + 575:1 error Line 575 exceeds the maximum line length of 100 max-len + 594:1 error Line 594 exceeds the maximum line length of 100 max-len + 673:1 error Line 673 exceeds the maximum line length of 100 max-len + 678:48 error Identifier 'label_id' is not in camel case camelcase + 701:1 error Line 701 exceeds the maximum line length of 100 max-len + 711:48 error Identifier 'label_id' is not in camel case camelcase + 736:1 error Line 736 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/shipping-label/selectors.js + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 97:1 error Line 97 exceeds the maximum line length of 100 max-len + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 147:10 error Identifier 'box_id' is not in camel case camelcase + 170:1 error Line 170 exceeds the maximum line length of 100 max-len + 228:1 error Line 228 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/shipping-label/test/actions.js + 15:1 error Expected indentation of 0 tabs but found 1 space indent + 96:7 error Identifier 'is_trivial_normalization' is not in camel case camelcase + 114:1 error Line 114 exceeds the maximum line length of 100 max-len + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 145:1 error Line 145 exceeds the maximum line length of 100 max-len + 150:1 error Line 150 exceeds the maximum line length of 100 max-len + 175:1 error Line 175 exceeds the maximum line length of 100 max-len + 180:1 error Line 180 exceeds the maximum line length of 100 max-len + 203:1 error Line 203 exceeds the maximum line length of 100 max-len + 208:1 error Line 208 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/shipping-label/test/reducer.js + 22:1 error Expected indentation of 1 tab but found 4 spaces indent + 27:1 error Expected indentation of 0 tabs but found 1 space indent + 43:6 error Identifier 'weight_0_custom1' is not in camel case camelcase + 46:9 error Identifier 'product_id' is not in camel case camelcase + 51:6 error Identifier 'weight_1_custom1' is not in camel case camelcase + 54:9 error Identifier 'product_id' is not in camel case camelcase + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + 101:1 error Line 101 exceeds the maximum line length of 100 max-len + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 111:1 error Line 111 exceeds the maximum line length of 100 max-len + 113:51 error Identifier 'client_individual_0' is not in camel case camelcase + 115:5 error Identifier 'product_id' is not in camel case camelcase + 117:4 error Identifier 'box_id' is not in camel case camelcase + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + 134:51 error Identifier 'weight_2_custom1' is not in camel case camelcase + 137:6 error Identifier 'product_id' is not in camel case camelcase + 143:4 error Identifier 'product_id' is not in camel case camelcase + 166:1 error Line 166 exceeds the maximum line length of 100 max-len + 168:1 error Line 168 exceeds the maximum line length of 100 max-len + 170:1 error Line 170 exceeds the maximum line length of 100 max-len + 179:1 error Line 179 exceeds the maximum line length of 100 max-len + 197:1 error Line 197 exceeds the maximum line length of 100 max-len + 199:1 error Line 199 exceeds the maximum line length of 100 max-len + 200:1 error Line 200 exceeds the maximum line length of 100 max-len + 214:5 error Identifier 'inner_dimensions' is not in camel case camelcase + 215:5 error Identifier 'box_weight' is not in camel case camelcase + 221:1 error Line 221 exceeds the maximum line length of 100 max-len + 227:1 error Line 227 exceeds the maximum line length of 100 max-len + 232:1 error Line 232 exceeds the maximum line length of 100 max-len + 243:5 error Identifier 'inner_dimensions' is not in camel case camelcase + 244:5 error Identifier 'box_weight' is not in camel case camelcase + 249:1 error Line 249 exceeds the maximum line length of 100 max-len + 263:1 error Line 263 exceeds the maximum line length of 100 max-len + 270:1 error Line 270 exceeds the maximum line length of 100 max-len + 308:1 error Line 308 exceeds the maximum line length of 100 max-len + 336:4 error Identifier 'label_id' is not in camel case camelcase + 338:4 error Identifier 'refundable_amount' is not in camel case camelcase + 340:4 error Identifier 'carrier_id' is not in camel case camelcase + 341:4 error Identifier 'service_name' is not in camel case camelcase + 342:4 error Identifier 'package_name' is not in camel case camelcase + 343:4 error Identifier 'product_names' is not in camel case camelcase + 360:51 error Identifier 'weight_0_custom1' is not in camel case camelcase + 363:6 error Identifier 'product_id' is not in camel case camelcase + 367:6 error Identifier 'product_id' is not in camel case camelcase + 373:51 error Identifier 'weight_1_custom1' is not in camel case camelcase + 376:6 error Identifier 'product_id' is not in camel case camelcase + 396:5 error Identifier 'inner_dimensions' is not in camel case camelcase + 397:5 error Identifier 'box_weight' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/state/shipping-label/test/selectors.js + 15:3 error Identifier 'box_1' is not in camel case camelcase + 18:3 error Identifier 'box_2' is not in camel case camelcase + 23:3 error Identifier 'box_1' is not in camel case camelcase + 24:4 error Identifier 'shipment_id' is not in camel case camelcase + 27:6 error Identifier 'rate_id' is not in camel case camelcase + 28:6 error Identifier 'service_id' is not in camel case camelcase + 29:6 error Identifier 'carrier_id' is not in camel case camelcase + 32:6 error Identifier 'is_selected' is not in camel case camelcase + 35:6 error Identifier 'rate_id' is not in camel case camelcase + 36:6 error Identifier 'service_id' is not in camel case camelcase + 37:6 error Identifier 'carrier_id' is not in camel case camelcase + 40:6 error Identifier 'is_selected' is not in camel case camelcase + 47:3 error Identifier 'box_2' is not in camel case camelcase + 48:4 error Identifier 'shipment_id' is not in camel case camelcase + 51:6 error Identifier 'rate_id' is not in camel case camelcase + 52:6 error Identifier 'service_id' is not in camel case camelcase + 53:6 error Identifier 'carrier_id' is not in camel case camelcase + 56:6 error Identifier 'is_selected' is not in camel case camelcase + 59:6 error Identifier 'rate_id' is not in camel case camelcase + 60:6 error Identifier 'service_id' is not in camel case camelcase + 61:6 error Identifier 'carrier_id' is not in camel case camelcase + 64:6 error Identifier 'is_selected' is not in camel case camelcase + 73:3 error Identifier 'box_1' is not in camel case camelcase + 82:3 error Identifier 'box_1' is not in camel case camelcase + 91:3 error Identifier 'box_1' is not in camel case camelcase + 99:3 error Identifier 'box_1' is not in camel case camelcase + 125:5 error Identifier 'box_1' is not in camel case camelcase + 134:6 error Identifier 'box_1' is not in camel case camelcase + 137:6 error Identifier 'box_1' is not in camel case camelcase + 151:5 error Identifier 'box_1' is not in camel case camelcase + 164:5 error Identifier 'box_1' is not in camel case camelcase + 171:6 error Identifier 'box_1' is not in camel case camelcase + 179:6 error Identifier 'box_1' is not in camel case camelcase + 201:7 error Identifier 'box_1' is not in camel case camelcase + 204:7 error Identifier 'box_1' is not in camel case camelcase + 213:6 error Identifier 'box_1' is not in camel case camelcase + 222:7 error Identifier 'box_1' is not in camel case camelcase + 225:7 error Identifier 'box_1' is not in camel case camelcase + 236:6 error Identifier 'box_1' is not in camel case camelcase + 237:6 error Identifier 'box_2' is not in camel case camelcase + 248:6 error Identifier 'box_1' is not in camel case camelcase + 249:6 error Identifier 'box_2' is not in camel case camelcase + 255:6 error Identifier 'box_1' is not in camel case camelcase + 256:6 error Identifier 'box_2' is not in camel case camelcase + 264:6 error Identifier 'box_1' is not in camel case camelcase + 265:6 error Identifier 'box_2' is not in camel case camelcase + 276:6 error Identifier 'box_1' is not in camel case camelcase + 277:6 error Identifier 'box_2' is not in camel case camelcase + 283:6 error Identifier 'box_1' is not in camel case camelcase + 284:6 error Identifier 'box_2' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/label-settings/index.js + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/label-settings/label-settings.js + 69:5 error Identifier 'payment_method_id' is not in camel case camelcase + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + 99:1 error Line 99 exceeds the maximum line length of 100 max-len + 158:1 error Line 158 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/packages/edit-package.js + 68:3 error Identifier 'inner_dimensions' is not in camel case camelcase + 69:3 error Identifier 'outer_dimensions' is not in camel case camelcase + 70:3 error Identifier 'box_weight' is not in camel case camelcase + 71:3 error Identifier 'max_weight' is not in camel case camelcase + 72:3 error Identifier 'is_letter' is not in camel case camelcase + 75:58 error Identifier 'outer_dimensions' is not in camel case camelcase + 96:34 error Identifier 'is_letter' is not in camel case camelcase + 105:14 error Identifier 'is_letter' is not in camel case camelcase + 154:1 error Line 154 exceeds the maximum line length of 100 max-len + 159:15 error Identifier 'box_weight' is not in camel case camelcase + 169:1 error Line 169 exceeds the maximum line length of 100 max-len + 174:15 error Identifier 'max_weight' is not in camel case camelcase + 185:1 error Line 185 exceeds the maximum line length of 100 max-len + 201:3 error Identifier 'inner_dimensions' is not in camel case camelcase + 202:3 error Identifier 'outer_dimensions' is not in camel case camelcase + 203:3 error Identifier 'box_weight' is not in camel case camelcase + 204:3 error Identifier 'max_weight' is not in camel case camelcase + 205:3 error Identifier 'is_user_defined' is not in camel case camelcase + 206:3 error Identifier 'is_letter' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/packages/index.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/packages/input-filters.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/packages/modal-errors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 48:3 error Identifier 'inner_dimensions' is not in camel case camelcase + 49:3 error Identifier 'outer_dimensions' is not in camel case camelcase + 50:3 error Identifier 'box_weight' is not in camel case camelcase + 51:3 error Identifier 'max_weight' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/packages/package-dialog.js + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 69:4 error Identifier 'inner_dimensions' is not in camel case camelcase + 70:4 error Identifier 'outer_dimensions' is not in camel case camelcase + 71:4 error Identifier 'box_weight' is not in camel case camelcase + 72:4 error Identifier 'max_weight' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/packages/packages-list-item.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 76:3 error Identifier 'is_letter' is not in camel case camelcase + 77:3 error Identifier 'inner_dimensions' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/packages/predefined-packages.js + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-details-modal.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-item.js + 101:1 error Line 101 exceeds the maximum line length of 100 max-len + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/address-step/fields.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + 147:1 error Expected indentation of 4 tabs but found 5 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/address-step/index.js + 25:1 error Expected indentation of 1 tab but found 2 indent + 26:1 error Expected indentation of 1 tab but found 2 indent + 27:1 error Expected indentation of 1 tab but found 2 indent + 28:1 error Expected indentation of 1 tab but found 2 indent + 29:1 error Expected indentation of 1 tab but found 2 indent + 30:1 error Expected indentation of 1 tab but found 2 indent + 31:1 error Expected indentation of 1 tab but found 2 indent + 32:1 error Expected indentation of 1 tab but found 2 indent + 33:1 error Expected indentation of 0 tabs but found 1 indent + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 75:1 error Line 75 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/address-step/suggestion.js + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 67:1 error Expected indentation of 1 tab but found 2 indent + 68:1 error Expected indentation of 1 tab but found 2 indent + 69:1 error Expected indentation of 1 tab but found 2 indent + 70:1 error Expected indentation of 1 tab but found 2 indent + 71:1 error Expected indentation of 1 tab but found 2 indent + 72:1 error Expected indentation of 1 tab but found 2 indent + 73:1 error Expected indentation of 1 tab but found 2 indent + 74:1 error Expected indentation of 1 tab but found 2 indent + 75:1 error Expected indentation of 0 tabs but found 1 indent + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/index.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 148:3 error Identifier 'currency_symbol' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/packages-step/add-item.js + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 56:1 error Expected indentation of 5 tabs but found 6 indent + 79:1 error Expected indentation of 3 tabs but found 4 indent + 80:1 error Expected indentation of 3 tabs but found 4 indent + 81:1 error Expected indentation of 3 tabs but found 4 indent + 82:1 error Expected indentation of 3 tabs but found 4 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/packages-step/get-package-descriptions.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/packages-step/index.js + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + 115:1 error Expected indentation of 6 tabs but found 7 indent + 116:1 error Expected indentation of 5 tabs but found 6 indent + 123:1 error Expected indentation of 4 tabs but found 5 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/packages-step/item-info.js + 67:1 error Expected indentation of 0 tabs but found 1 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/packages-step/list.js + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/packages-step/move-item.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 99:1 error Line 99 exceeds the maximum line length of 100 max-len + 109:1 error Expected indentation of 3 tabs but found 4 indent + 110:1 error Expected indentation of 3 tabs but found 4 indent + 111:1 error Expected indentation of 3 tabs but found 4 indent + 112:1 error Expected indentation of 3 tabs but found 4 indent + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 125:56 error Multiple spaces found before '// Result of t...' no-multi-spaces + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/packages-step/package-info.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 41:1 error Expected indentation of 2 tabs but found 1 indent + 42:1 error Expected indentation of 2 tabs but found 1 indent + 83:1 error Line 83 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 129:1 error Line 129 exceeds the maximum line length of 100 max-len + 139:1 error Line 139 exceeds the maximum line length of 100 max-len + 140:1 error Line 140 exceeds the maximum line length of 100 max-len + 155:1 error Line 155 exceeds the maximum line length of 100 max-len + 170:1 error Line 170 exceeds the maximum line length of 100 max-len + 170:1 error Expected indentation of 5 tabs but found 4 indent + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/rates-step/index.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 99:1 error Line 99 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/rates-step/list.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 29:1 error Expected indentation of 1 tab but found 2 indent + 30:1 error Expected indentation of 1 tab but found 2 indent + 31:1 error Expected indentation of 1 tab but found 2 indent + 32:1 error Expected indentation of 1 tab but found 2 indent + 33:1 error Expected indentation of 1 tab but found 2 indent + 34:1 error Expected indentation of 1 tab but found 2 indent + 35:1 error Expected indentation of 1 tab but found 2 indent + 36:1 error Expected indentation of 1 tab but found 2 indent + 37:1 error Expected indentation of 1 tab but found 2 indent + 38:1 error Expected indentation of 1 tab but found 2 indent + 39:1 error Expected indentation of 0 tabs but found 1 indent + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/rates-step/test/list.js + 20:2 error Identifier 'small_flat_box' is not in camel case camelcase + 21:3 error Identifier 'inner_dimensions' is not in camel case camelcase + 22:3 error Identifier 'outer_dimensions' is not in camel case camelcase + 29:3 error Identifier 'box_weight' is not in camel case camelcase + 30:3 error Identifier 'max_weight' is not in camel case camelcase + 31:3 error Identifier 'is_letter' is not in camel case camelcase + 32:3 error Identifier 'is_flat_rate' is not in camel case camelcase + 33:3 error Identifier 'group_id' is not in camel case camelcase + 35:2 error Identifier 'medium_flat_box_top' is not in camel case camelcase + 36:3 error Identifier 'inner_dimensions' is not in camel case camelcase + 37:3 error Identifier 'outer_dimensions' is not in camel case camelcase + 44:3 error Identifier 'box_weight' is not in camel case camelcase + 45:3 error Identifier 'max_weight' is not in camel case camelcase + 46:3 error Identifier 'is_letter' is not in camel case camelcase + 47:3 error Identifier 'is_flat_rate' is not in camel case camelcase + 48:3 error Identifier 'group_id' is not in camel case camelcase + 52:7 error Identifier 'package_1_rate' is not in camel case camelcase + 53:2 error Identifier 'shipment_id' is not in camel case camelcase + 56:3 error Identifier 'rate_id' is not in camel case camelcase + 57:3 error Identifier 'carrier_id' is not in camel case camelcase + 59:3 error Identifier 'service_id' is not in camel case camelcase + 63:7 error Identifier 'package_1_error' is not in camel case camelcase + 67:7 error Identifier 'package_2_rate' is not in camel case camelcase + 68:2 error Identifier 'shipment_id' is not in camel case camelcase + 71:3 error Identifier 'rate_id' is not in camel case camelcase + 72:3 error Identifier 'carrier_id' is not in camel case camelcase + 74:3 error Identifier 'service_id' is not in camel case camelcase + 78:7 error Identifier 'package_2_error' is not in camel case camelcase + 82:7 error Identifier 'selectedPackage_1' is not in camel case camelcase + 83:2 error Identifier 'weight_0_individual' is not in camel case camelcase + 85:3 error Identifier 'box_id' is not in camel case camelcase + 91:4 error Identifier 'product_id' is not in camel case camelcase + 100:3 error Identifier 'service_id' is not in camel case camelcase + 104:7 error Identifier 'selectedPackage_2' is not in camel case camelcase + 105:2 error Identifier 'weight_1_individual' is not in camel case camelcase + 107:3 error Identifier 'box_id' is not in camel case camelcase + 113:4 error Identifier 'product_id' is not in camel case camelcase + 122:3 error Identifier 'service_id' is not in camel case camelcase + 126:7 error Identifier 'server_error_1' is not in camel case camelcase + 127:2 error Identifier 'weight_0_individual' is not in camel case camelcase + 130:7 error Identifier 'server_error_2' is not in camel case camelcase + 131:2 error Identifier 'weight_1_individual' is not in camel case camelcase + 134:7 error Identifier 'form_error_1' is not in camel case camelcase + 135:2 error Identifier 'weight_0_individual' is not in camel case camelcase + 138:7 error Identifier 'form_error_2' is not in camel case camelcase + 139:2 error Identifier 'weight_1_individual' is not in camel case camelcase + 157:4 error Identifier 'weight_0_individual' is not in camel case camelcase + 159:21 error Identifier 'selectedPackage_1' is not in camel case camelcase + 168:4 error Identifier 'weight_0_individual' is not in camel case camelcase + 169:4 error Identifier 'weight_1_individual' is not in camel case camelcase + 177:4 error Identifier 'weight_0_individual' is not in camel case camelcase + 178:4 error Identifier 'weight_1_individual' is not in camel case camelcase + 214:7 error Identifier 'weight_0_individual' is not in camel case camelcase + 214:28 error Identifier 'package_1_rate' is not in camel case camelcase + 217:7 error Identifier 'weight_0_individual' is not in camel case camelcase + 243:7 error Identifier 'weight_0_individual' is not in camel case camelcase + 243:28 error Identifier 'package_1_error' is not in camel case camelcase + 246:7 error Identifier 'weight_0_individual' is not in camel case camelcase + 250:8 error Identifier 'weight_0_individual' is not in camel case camelcase + 253:8 error Identifier 'weight_0_individual' is not in camel case camelcase + 278:7 error Identifier 'weight_0_individual' is not in camel case camelcase + 281:7 error Identifier 'weight_0_individual' is not in camel case camelcase + 285:8 error Identifier 'weight_0_individual' is not in camel case camelcase + 288:8 error Identifier 'weight_0_individual' is not in camel case camelcase + 313:7 error Identifier 'weight_0_individual' is not in camel case camelcase + 313:28 error Identifier 'package_1_rate' is not in camel case camelcase + 314:7 error Identifier 'weight_1_individual' is not in camel case camelcase + 314:28 error Identifier 'package_2_rate' is not in camel case camelcase + 337:7 error Identifier 'weight_0_individual' is not in camel case camelcase + 337:28 error Identifier 'package_1_error' is not in camel case camelcase + 338:7 error Identifier 'weight_1_individual' is not in camel case camelcase + 338:28 error Identifier 'package_2_error' is not in camel case camelcase + 349:1 error Line 349 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/sidebar.js + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-purchase-modal/step-container.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-refund-modal.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/label-reprint-modal.js + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/woocommerce/woocommerce-services/views/shipping-label/tracking-link.js + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + 11:1 error Line 11 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/data-layer/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/data-layer/settings/test/index.js + 28:3 error Identifier 'job_manager_hide_filled_positions' is not in camel case camelcase + 29:3 error Identifier 'job_manager_per_page' is not in camel case camelcase + 219:1 error Line 219 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/data-layer/settings/utils.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 3:2 error Identifier 'job_manager_allowed_application_method' is not in camel case camelcase + 4:2 error Identifier 'job_manager_category_filter_type' is not in camel case camelcase + 5:2 error Identifier 'job_manager_date_format' is not in camel case camelcase + 6:2 error Identifier 'job_manager_enable_categories' is not in camel case camelcase + 7:2 error Identifier 'job_manager_enable_default_category_multiselect' is not in camel case camelcase + 8:2 error Identifier 'job_manager_enable_registration' is not in camel case camelcase + 9:2 error Identifier 'job_manager_enable_types' is not in camel case camelcase + 10:2 error Identifier 'job_manager_generate_username_from_email' is not in camel case camelcase + 11:2 error Identifier 'job_manager_google_maps_api_key' is not in camel case camelcase + 12:2 error Identifier 'job_manager_hide_expired' is not in camel case camelcase + 13:2 error Identifier 'job_manager_hide_expired_content' is not in camel case camelcase + 14:2 error Identifier 'job_manager_hide_filled_positions' is not in camel case camelcase + 15:2 error Identifier 'job_manager_job_dashboard_page_id' is not in camel case camelcase + 16:2 error Identifier 'job_manager_jobs_page_id' is not in camel case camelcase + 17:2 error Identifier 'job_manager_multi_job_type' is not in camel case camelcase + 18:2 error Identifier 'job_manager_per_page' is not in camel case camelcase + 19:2 error Identifier 'job_manager_registration_role' is not in camel case camelcase + 20:2 error Identifier 'job_manager_submission_duration' is not in camel case camelcase + 21:2 error Identifier 'job_manager_submission_requires_approval' is not in camel case camelcase + 22:2 error Identifier 'job_manager_submit_job_form_page_id' is not in camel case camelcase + 23:2 error Identifier 'job_manager_use_standard_password_setup_email' is not in camel case camelcase + 24:2 error Identifier 'job_manager_user_can_edit_pending_submissions' is not in camel case camelcase + 25:2 error Identifier 'job_manager_user_requires_account' is not in camel case camelcase + 28:23 error Identifier 'job_manager_enable_registration' is not in camel case camelcase + 29:21 error Identifier 'job_manager_generate_username_from_email' is not in camel case camelcase + 30:22 error Identifier 'job_manager_user_requires_account' is not in camel case camelcase + 31:9 error Identifier 'job_manager_registration_role' is not in camel case camelcase + 32:17 error Identifier 'job_manager_use_standard_password_setup_email' is not in camel case camelcase + 35:21 error Identifier 'job_manager_google_maps_api_key' is not in camel case camelcase + 38:12 error Identifier 'job_manager_user_can_edit_pending_submissions' is not in camel case camelcase + 39:23 error Identifier 'job_manager_submission_requires_approval' is not in camel case camelcase + 42:23 error Identifier 'job_manager_category_filter_type' is not in camel case camelcase + 43:21 error Identifier 'job_manager_enable_categories' is not in camel case camelcase + 44:26 error Identifier 'job_manager_enable_default_category_multiselect' is not in camel case camelcase + 47:23 error Identifier 'job_manager_submission_duration' is not in camel case camelcase + 50:15 error Identifier 'job_manager_date_format' is not in camel case camelcase + 53:16 error Identifier 'job_manager_hide_expired' is not in camel case camelcase + 54:23 error Identifier 'job_manager_hide_expired_content' is not in camel case camelcase + 55:24 error Identifier 'job_manager_hide_filled_positions' is not in camel case camelcase + 56:12 error Identifier 'job_manager_per_page' is not in camel case camelcase + 59:22 error Identifier 'job_manager_allowed_application_method' is not in camel case camelcase + 62:18 error Identifier 'job_manager_job_dashboard_page_id' is not in camel case camelcase + 63:17 error Identifier 'job_manager_jobs_page_id' is not in camel case camelcase + 64:19 error Identifier 'job_manager_submit_job_form_page_id' is not in camel case camelcase + 67:16 error Identifier 'job_manager_enable_types' is not in camel case camelcase + 68:17 error Identifier 'job_manager_multi_job_type' is not in camel case camelcase + 97:2 error Identifier 'job_manager_allowed_application_method' is not in camel case camelcase + 98:2 error Identifier 'job_manager_category_filter_type' is not in camel case camelcase + 99:2 error Identifier 'job_manager_date_format' is not in camel case camelcase + 100:2 error Identifier 'job_manager_enable_categories' is not in camel case camelcase + 101:2 error Identifier 'job_manager_enable_default_category_multiselect' is not in camel case camelcase + 102:2 error Identifier 'job_manager_enable_registration' is not in camel case camelcase + 103:2 error Identifier 'job_manager_enable_types' is not in camel case camelcase + 104:2 error Identifier 'job_manager_generate_username_from_email' is not in camel case camelcase + 105:2 error Identifier 'job_manager_google_maps_api_key' is not in camel case camelcase + 106:2 error Identifier 'job_manager_hide_expired' is not in camel case camelcase + 107:2 error Identifier 'job_manager_hide_expired_content' is not in camel case camelcase + 108:2 error Identifier 'job_manager_hide_filled_positions' is not in camel case camelcase + 109:2 error Identifier 'job_manager_job_dashboard_page_id' is not in camel case camelcase + 110:2 error Identifier 'job_manager_jobs_page_id' is not in camel case camelcase + 111:2 error Identifier 'job_manager_multi_job_type' is not in camel case camelcase + 112:2 error Identifier 'job_manager_per_page' is not in camel case camelcase + 113:2 error Identifier 'job_manager_registration_role' is not in camel case camelcase + 114:2 error Identifier 'job_manager_submission_duration' is not in camel case camelcase + 115:2 error Identifier 'job_manager_submission_requires_approval' is not in camel case camelcase + 116:2 error Identifier 'job_manager_submit_job_form_page_id' is not in camel case camelcase + 117:2 error Identifier 'job_manager_use_standard_password_setup_email' is not in camel case camelcase + 118:2 error Identifier 'job_manager_user_can_edit_pending_submissions' is not in camel case camelcase + 119:2 error Identifier 'job_manager_user_requires_account' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/data-layer/setup/test/index.js + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 114:1 error Line 114 exceeds the maximum line length of 100 max-len + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + 143:1 error Line 143 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/settings/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/settings/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/settings/schema.js + 10:5 error Identifier 'job_manager_per_page' is not in camel case camelcase + 11:5 error Identifier 'job_manager_hide_filled_positions' is not in camel case camelcase + 12:5 error Identifier 'job_manager_hide_expired' is not in camel case camelcase + 13:5 error Identifier 'job_manager_hide_expired_content' is not in camel case camelcase + 14:5 error Identifier 'job_manager_enable_categories' is not in camel case camelcase + 15:5 error Identifier 'job_manager_enable_default_category_multiselect' is not in camel case camelcase + 16:5 error Identifier 'job_manager_category_filter_type' is not in camel case camelcase + 17:5 error Identifier 'job_manager_date_format' is not in camel case camelcase + 18:5 error Identifier 'job_manager_enable_types' is not in camel case camelcase + 19:5 error Identifier 'job_manager_multi_job_type' is not in camel case camelcase + 20:5 error Identifier 'job_manager_google_maps_api_key' is not in camel case camelcase + 21:5 error Identifier 'job_manager_user_requires_account' is not in camel case camelcase + 22:5 error Identifier 'job_manager_enable_registration' is not in camel case camelcase + 23:5 error Identifier 'job_manager_generate_username_from_email' is not in camel case camelcase + 24:5 error Identifier 'job_manager_registration_role' is not in camel case camelcase + 25:5 error Identifier 'job_manager_submission_requires_approval' is not in camel case camelcase + 26:5 error Identifier 'job_manager_user_can_edit_pending_submissions' is not in camel case camelcase + 27:5 error Identifier 'job_manager_submission_duration' is not in camel case camelcase + 28:5 error Identifier 'job_manager_allowed_application_method' is not in camel case camelcase + 29:5 error Identifier 'job_manager_submit_job_form_page_id' is not in camel case camelcase + 30:5 error Identifier 'job_manager_job_dashboard_page_id' is not in camel case camelcase + 31:5 error Identifier 'job_manager_jobs_page_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/settings/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/settings/test/actions.js + 22:3 error Identifier 'job_manager_per_page' is not in camel case camelcase + 23:3 error Identifier 'job_manager_hide_filled_positions' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/settings/test/reducer.js + 102:29 error Identifier 'job_manager_hide_filled_positions' is not in camel case camelcase + 103:31 error Identifier 'job_manager_hide_filled_positions' is not in camel case camelcase + 151:1 error Line 151 exceeds the maximum line length of 100 max-len + 153:5 error Identifier 'job_manager_hide_expired' is not in camel case camelcase + 154:5 error Identifier 'job_manager_hide_filled_positions' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/settings/test/selectors.js + 84:29 error Identifier 'job_manager_hide_expired' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/setup/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/setup/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-job-manager/state/setup/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/app/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/cache/actions.js + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 128:1 error Line 128 exceeds the maximum line length of 100 max-len + 141:1 error Line 141 exceeds the maximum line length of 100 max-len + 170:1 error Line 170 exceeds the maximum line length of 100 max-len + 184:1 error Line 184 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/cache/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/cache/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/cache/test/actions.js + 93:20 error Identifier 'wp_delete_cache' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/cache/test/reducer.js + 342:1 error Line 342 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/plugins/actions.js + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/plugins/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/plugins/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/plugins/test/actions.js + 33:4 error Identifier 'is_cache_enabled' is not in camel case camelcase + 34:4 error Identifier 'is_super_cache_enabled' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/plugins/test/reducer.js + 108:25 error Identifier 'no_adverts_for_friends' is not in camel case camelcase + 125:26 error Identifier 'no_adverts_for_friends' is not in camel case camelcase + 137:26 error Identifier 'no_adverts_for_friends' is not in camel case camelcase + 150:26 error Identifier 'no_adverts_for_friends' is not in camel case camelcase + 163:26 error Identifier 'no_adverts_for_friends' is not in camel case camelcase + 190:1 error Line 190 exceeds the maximum line length of 100 max-len + 195:4 error Identifier 'no_adverts_for_friends' is not in camel case camelcase + 250:1 error Line 250 exceeds the maximum line length of 100 max-len + 251:25 error Identifier 'is_cache_enabled' is not in camel case camelcase + 251:50 error Identifier 'is_super_cache_enabled' is not in camel case camelcase + 259:26 error Identifier 'is_cache_enabled' is not in camel case camelcase + 259:51 error Identifier 'is_super_cache_enabled' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/plugins/test/selectors.js + 90:30 error Identifier 'no_adverts_for_friends' is not in camel case camelcase + 107:30 error Identifier 'no_adverts_for_friends' is not in camel case camelcase + 124:30 error Identifier 'no_adverts_for_friends' is not in camel case camelcase + 142:1 error Line 142 exceeds the maximum line length of 100 max-len + 145:4 error Identifier 'no_adverts_for_friends' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/settings/actions.js + 123:1 error Line 123 exceeds the maximum line length of 100 max-len + 130:1 error Line 130 exceeds the maximum line length of 100 max-len + 142:1 error Line 142 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/settings/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 131:5 error Identifier 'is_preloading' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/settings/schema.js + 10:5 error Identifier 'cache_acceptable_files' is not in camel case camelcase + 11:5 error Identifier 'cache_compression' is not in camel case camelcase + 12:5 error Identifier 'cache_direct_pages' is not in camel case camelcase + 16:5 error Identifier 'cache_disable_locking' is not in camel case camelcase + 17:5 error Identifier 'cache_gc_email_me' is not in camel case camelcase + 18:5 error Identifier 'cache_hello_world' is not in camel case camelcase + 19:5 error Identifier 'cache_late_init' is not in camel case camelcase + 20:5 error Identifier 'cache_list' is not in camel case camelcase + 21:5 error Identifier 'cache_lock_down' is not in camel case camelcase + 22:5 error Identifier 'cache_max_time' is not in camel case camelcase + 23:5 error Identifier 'cache_mobile_browsers' is not in camel case camelcase + 24:5 error Identifier 'cache_mobile_prefixes' is not in camel case camelcase + 25:5 error Identifier 'cache_mod_rewrite' is not in camel case camelcase + 26:5 error Identifier 'cache_next_gc' is not in camel case camelcase + 27:5 error Identifier 'cache_path' is not in camel case camelcase + 28:5 error Identifier 'cache_path_url' is not in camel case camelcase + 29:5 error Identifier 'cache_rebuild' is not in camel case camelcase + 30:5 error Identifier 'cache_rejected_uri' is not in camel case camelcase + 31:5 error Identifier 'cache_rejected_user_agent' is not in camel case camelcase + 32:5 error Identifier 'cache_schedule_interval' is not in camel case camelcase + 33:5 error Identifier 'cache_schedule_type' is not in camel case camelcase + 34:5 error Identifier 'cache_scheduled_time' is not in camel case camelcase + 35:5 error Identifier 'cache_time_interval' is not in camel case camelcase + 36:5 error Identifier 'cache_type' is not in camel case camelcase + 37:5 error Identifier 'clear_cache_on_post_edit' is not in camel case camelcase + 38:5 error Identifier 'disable_utf8' is not in camel case camelcase + 39:5 error Identifier 'dont_cache_logged_in' is not in camel case camelcase + 40:5 error Identifier 'front_page_checks' is not in camel case camelcase + 41:5 error Identifier 'is_cache_enabled' is not in camel case camelcase + 42:5 error Identifier 'is_mfunc_enabled' is not in camel case camelcase + 43:5 error Identifier 'is_mobile_enabled' is not in camel case camelcase + 44:5 error Identifier 'is_preloading' is not in camel case camelcase + 45:5 error Identifier 'is_super_cache_enabled' is not in camel case camelcase + 46:5 error Identifier 'make_known_anon' is not in camel case camelcase + 47:5 error Identifier 'minimum_preload_interval' is not in camel case camelcase + 48:5 error Identifier 'no_cache_for_get' is not in camel case camelcase + 49:5 error Identifier 'ossdl_cname' is not in camel case camelcase + 50:5 error Identifier 'ossdl_https' is not in camel case camelcase + 51:5 error Identifier 'ossdl_off_cdn_url' is not in camel case camelcase + 52:5 error Identifier 'ossdl_off_exclude' is not in camel case camelcase + 53:5 error Identifier 'ossdl_off_include_dirs' is not in camel case camelcase + 70:5 error Identifier 'post_count' is not in camel case camelcase + 71:5 error Identifier 'preload_email_volume' is not in camel case camelcase + 72:5 error Identifier 'preload_interval' is not in camel case camelcase + 73:5 error Identifier 'preload_on' is not in camel case camelcase + 74:5 error Identifier 'preload_posts' is not in camel case camelcase + 75:5 error Identifier 'preload_taxonomies' is not in camel case camelcase + 76:5 error Identifier 'refresh_current_only_on_comments' is not in camel case camelcase + 77:5 error Identifier 'use_304_headers' is not in camel case camelcase + 78:5 error Identifier 'wp_super_cache_debug' is not in camel case camelcase + 79:5 error Identifier 'wp_cache_debug_ip' is not in camel case camelcase + 80:5 error Identifier 'wp_super_cache_comments' is not in camel case camelcase + 81:5 error Identifier 'wp_super_cache_front_page_check' is not in camel case camelcase + 82:5 error Identifier 'wp_super_cache_front_page_clear' is not in camel case camelcase + 83:5 error Identifier 'wp_super_cache_front_page_text' is not in camel case camelcase + 84:5 error Identifier 'wp_super_cache_front_page_notification' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/settings/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/settings/test/actions.js + 36:4 error Identifier 'is_cache_enabled' is not in camel case camelcase + 37:4 error Identifier 'is_super_cache_enabled' is not in camel case camelcase + 105:4 error Identifier 'is_cache_enabled' is not in camel case camelcase + 106:4 error Identifier 'is_super_cache_enabled' is not in camel case camelcase + 139:1 error Line 139 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/settings/test/reducer.js + 286:29 error Identifier 'is_cache_enabled' is not in camel case camelcase + 287:31 error Identifier 'is_cache_enabled' is not in camel case camelcase + 337:1 error Line 337 exceeds the maximum line length of 100 max-len + 338:26 error Identifier 'is_cache_enabled' is not in camel case camelcase + 338:51 error Identifier 'is_super_cache_enabled' is not in camel case camelcase + 346:26 error Identifier 'is_cache_enabled' is not in camel case camelcase + 346:51 error Identifier 'is_super_cache_enabled' is not in camel case camelcase + 387:7 error Identifier 'is_preloading' is not in camel case camelcase + 404:7 error Identifier 'is_preloading' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/settings/test/selectors.js + 261:29 error Identifier 'is_cache_enabled' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/settings/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/stats/actions.js + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/stats/reducer.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 87:5 error Identifier 'expired_list' is not in camel case camelcase + 94:6 error Identifier 'cached_list' is not in camel case camelcase + 112:1 error Line 112 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/stats/schema.js + 4:2 error Identifier 'cached_list' is not in camel case camelcase + 6:2 error Identifier 'expired_list' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/stats/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/stats/test/actions.js + 36:5 error Identifier 'cached_list' is not in camel case camelcase + 38:7 error Identifier 'lower_age' is not in camel case camelcase + 40:7 error Identifier 'upper_age' is not in camel case camelcase + 45:5 error Identifier 'expired_list' is not in camel case camelcase + 50:5 error Identifier 'cached_list' is not in camel case camelcase + 52:5 error Identifier 'expired_list' is not in camel case camelcase + 54:7 error Identifier 'lower_age' is not in camel case camelcase + 56:7 error Identifier 'upper_age' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/stats/test/reducer.js + 22:1 error '../reducer' import is duplicated no-duplicate-imports + 149:8 error Identifier 'cached_list' is not in camel case camelcase + 152:10 error Identifier 'lower_age' is not in camel case camelcase + 153:10 error Identifier 'upper_age' is not in camel case camelcase + 157:8 error Identifier 'expired_list' is not in camel case camelcase + 257:1 error Line 257 exceeds the maximum line length of 100 max-len + 313:8 error Identifier 'cached_list' is not in camel case camelcase + 316:10 error Identifier 'lower_age' is not in camel case camelcase + 317:10 error Identifier 'upper_age' is not in camel case camelcase + 321:8 error Identifier 'expired_list' is not in camel case camelcase + 324:10 error Identifier 'lower_age' is not in camel case camelcase + 325:10 error Identifier 'upper_age' is not in camel case camelcase + 332:8 error Identifier 'cached_list' is not in camel case camelcase + 335:10 error Identifier 'lower_age' is not in camel case camelcase + 336:10 error Identifier 'upper_age' is not in camel case camelcase + 340:8 error Identifier 'expired_list' is not in camel case camelcase + 343:10 error Identifier 'lower_age' is not in camel case camelcase + 344:10 error Identifier 'upper_age' is not in camel case camelcase + 353:1 error Line 353 exceeds the maximum line length of 100 max-len + 364:8 error Identifier 'cached_list' is not in camel case camelcase + 367:10 error Identifier 'lower_age' is not in camel case camelcase + 368:10 error Identifier 'upper_age' is not in camel case camelcase + 372:8 error Identifier 'expired_list' is not in camel case camelcase + 377:8 error Identifier 'cached_list' is not in camel case camelcase + 380:10 error Identifier 'lower_age' is not in camel case camelcase + 381:10 error Identifier 'upper_age' is not in camel case camelcase + 385:8 error Identifier 'expired_list' is not in camel case camelcase + 392:1 error Line 392 exceeds the maximum line length of 100 max-len + 403:8 error Identifier 'cached_list' is not in camel case camelcase + 405:8 error Identifier 'expired_list' is not in camel case camelcase + 410:8 error Identifier 'cached_list' is not in camel case camelcase + 412:8 error Identifier 'expired_list' is not in camel case camelcase + 427:9 error Identifier 'cached_list' is not in camel case camelcase + 430:11 error Identifier 'lower_age' is not in camel case camelcase + 431:11 error Identifier 'upper_age' is not in camel case camelcase + 435:9 error Identifier 'expired_list' is not in camel case camelcase + 438:11 error Identifier 'lower_age' is not in camel case camelcase + 439:11 error Identifier 'upper_age' is not in camel case camelcase + 459:8 error Identifier 'cached_list' is not in camel case camelcase + 462:10 error Identifier 'lower_age' is not in camel case camelcase + 463:10 error Identifier 'upper_age' is not in camel case camelcase + 467:8 error Identifier 'expired_list' is not in camel case camelcase + 480:9 error Identifier 'cached_list' is not in camel case camelcase + 483:11 error Identifier 'lower_age' is not in camel case camelcase + 484:11 error Identifier 'upper_age' is not in camel case camelcase + 488:9 error Identifier 'expired_list' is not in camel case camelcase + 491:11 error Identifier 'lower_age' is not in camel case camelcase + 492:11 error Identifier 'upper_age' is not in camel case camelcase + 512:8 error Identifier 'cached_list' is not in camel case camelcase + 514:8 error Identifier 'expired_list' is not in camel case camelcase + 517:10 error Identifier 'lower_age' is not in camel case camelcase + 518:10 error Identifier 'upper_age' is not in camel case camelcase + 533:9 error Identifier 'cached_list' is not in camel case camelcase + 536:11 error Identifier 'lower_age' is not in camel case camelcase + 537:11 error Identifier 'upper_age' is not in camel case camelcase + 541:9 error Identifier 'expired_list' is not in camel case camelcase + 544:11 error Identifier 'lower_age' is not in camel case camelcase + 545:11 error Identifier 'upper_age' is not in camel case camelcase + 565:8 error Identifier 'cached_list' is not in camel case camelcase + 568:10 error Identifier 'lower_age' is not in camel case camelcase + 569:10 error Identifier 'upper_age' is not in camel case camelcase + 573:8 error Identifier 'expired_list' is not in camel case camelcase + 586:9 error Identifier 'cached_list' is not in camel case camelcase + 589:11 error Identifier 'lower_age' is not in camel case camelcase + 590:11 error Identifier 'upper_age' is not in camel case camelcase + 594:9 error Identifier 'expired_list' is not in camel case camelcase + 597:11 error Identifier 'lower_age' is not in camel case camelcase + 598:11 error Identifier 'upper_age' is not in camel case camelcase + 618:8 error Identifier 'cached_list' is not in camel case camelcase + 620:8 error Identifier 'expired_list' is not in camel case camelcase + 623:10 error Identifier 'lower_age' is not in camel case camelcase + 624:10 error Identifier 'upper_age' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/status/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/status/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/status/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/status/test/actions.js + 29:4 error Identifier 'cache_writable' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/status/test/reducer.js + 106:4 error Identifier 'cache_writable' is not in camel case camelcase + 112:4 error Identifier 'cache_readonly' is not in camel case camelcase + 166:1 error Line 166 exceeds the maximum line length of 100 max-len + 168:5 error Identifier 'cache_writable' is not in camel case camelcase + 172:5 error Identifier 'cache_readonly' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/wp-super-cache/state/status/test/selectors.js + 83:4 error Identifier 'cache_writable' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/data-layer/feeds/util.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'posts' valid-jsdoc + 1:1 error Missing JSDoc for parameter 'siteId' valid-jsdoc + 11:2 error Identifier 'post_ids' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/data-layer/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/data-layer/zones/index.js + 162:1 error Line 162 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/data-layer/zones/test/index.js + 34:4 error Identifier 'term_id' is not in camel case camelcase + 43:2 error Identifier 'term_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/data-layer/zones/utils.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 2:53 error Identifier 'term_id' is not in camel case camelcase + 4:6 error Identifier 'term_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/feeds/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 26:1 error Duplicate JSDoc parameter 'zoneId' valid-jsdoc + 26:1 error Expected JSDoc for 'form' but found 'posts' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/feeds/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/feeds/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/zones/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/zones/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/extensions/zoninator/state/zones/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/jetpack-connect/controller.js + 145:1 error Line 145 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/jetpack-connect/index.js + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/jetpack-connect/test/lib/plans.js + 30:2 error Identifier 'product_id' is not in camel case camelcase + 31:2 error Identifier 'product_slug' is not in camel case camelcase + 32:2 error Identifier 'product_name_short' is not in camel case camelcase + 33:2 error Identifier 'free_trial' is not in camel case camelcase + 35:2 error Identifier 'user_is_owner' is not in camel case camelcase + 36:2 error Identifier 'is_free' is not in camel case camelcase + 40:2 error Identifier 'product_id' is not in camel case camelcase + 41:2 error Identifier 'product_slug' is not in camel case camelcase + 42:2 error Identifier 'product_name_short' is not in camel case camelcase + 43:2 error Identifier 'free_trial' is not in camel case camelcase + 45:2 error Identifier 'user_is_owner' is not in camel case camelcase + 46:2 error Identifier 'is_free' is not in camel case camelcase + 50:2 error Identifier 'product_id' is not in camel case camelcase + 51:2 error Identifier 'product_slug' is not in camel case camelcase + 52:2 error Identifier 'product_name_short' is not in camel case camelcase + 53:2 error Identifier 'free_trial' is not in camel case camelcase + 55:2 error Identifier 'user_is_owner' is not in camel case camelcase + 56:2 error Identifier 'is_free' is not in camel case camelcase + 60:2 error Identifier 'product_id' is not in camel case camelcase + 61:2 error Identifier 'product_slug' is not in camel case camelcase + 62:2 error Identifier 'product_name_short' is not in camel case camelcase + 63:2 error Identifier 'free_trial' is not in camel case camelcase + 65:2 error Identifier 'user_is_owner' is not in camel case camelcase + 66:2 error Identifier 'is_free' is not in camel case camelcase + 100:2 error Identifier 'is_private' is not in camel case camelcase + 101:2 error Identifier 'is_vip' is not in camel case camelcase + 103:3 error Identifier 'gmt_offset' is not in camel case camelcase + 104:3 error Identifier 'videopress_enabled' is not in camel case camelcase + 105:3 error Identifier 'upgraded_filetypes_enabled' is not in camel case camelcase + 106:3 error Identifier 'admin_url' is not in camel case camelcase + 107:3 error Identifier 'is_mapped_domain' is not in camel case camelcase + 108:3 error Identifier 'is_redirect' is not in camel case camelcase + 109:3 error Identifier 'unmapped_url' is not in camel case camelcase + 110:3 error Identifier 'permalink_structure' is not in camel case camelcase + 111:3 error Identifier 'default_post_format' is not in camel case camelcase + 112:3 error Identifier 'allowed_file_types' is not in camel case camelcase + 129:3 error Identifier 'show_on_front' is not in camel case camelcase + 130:3 error Identifier 'default_likes_enabled' is not in camel case camelcase + 131:3 error Identifier 'default_sharing_status' is not in camel case camelcase + 132:3 error Identifier 'software_version' is not in camel case camelcase + 133:3 error Identifier 'created_at' is not in camel case camelcase + 135:3 error Identifier 'publicize_permanently_disabled' is not in camel case camelcase + 136:3 error Identifier 'frame_nonce' is not in camel case camelcase + 137:3 error Identifier 'advanced_seo_front_page_description' is not in camel case camelcase + 138:3 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 139:3 error Identifier 'verification_services_codes' is not in camel case camelcase + 140:3 error Identifier 'podcasting_archive' is not in camel case camelcase + 141:3 error Identifier 'is_domain_only' is not in camel case camelcase + 142:3 error Identifier 'is_automated_transfer' is not in camel case camelcase + 143:3 error Identifier 'jetpack_version' is not in camel case camelcase + 144:3 error Identifier 'main_network_site' is not in camel case camelcase + 145:3 error Identifier 'active_modules' is not in camel case camelcase + 169:3 error Identifier 'max_upload_size' is not in camel case camelcase + 170:3 error Identifier 'is_multi_network' is not in camel case camelcase + 171:3 error Identifier 'is_multi_site' is not in camel case camelcase + 172:3 error Identifier 'file_mod_disabled' is not in camel case camelcase + 174:2 error Identifier 'is_multisite' is not in camel case camelcase + 176:3 error Identifier 'edit_pages' is not in camel case camelcase + 177:3 error Identifier 'edit_posts' is not in camel case camelcase + 178:3 error Identifier 'edit_others_posts' is not in camel case camelcase + 179:3 error Identifier 'edit_others_pages' is not in camel case camelcase + 180:3 error Identifier 'delete_posts' is not in camel case camelcase + 181:3 error Identifier 'delete_others_posts' is not in camel case camelcase + 182:3 error Identifier 'edit_theme_options' is not in camel case camelcase + 183:3 error Identifier 'edit_users' is not in camel case camelcase + 184:3 error Identifier 'list_users' is not in camel case camelcase + 185:3 error Identifier 'manage_categories' is not in camel case camelcase + 186:3 error Identifier 'manage_options' is not in camel case camelcase + 187:3 error Identifier 'moderate_comments' is not in camel case camelcase + 188:3 error Identifier 'activate_wordads' is not in camel case camelcase + 189:3 error Identifier 'promote_users' is not in camel case camelcase + 190:3 error Identifier 'publish_posts' is not in camel case camelcase + 191:3 error Identifier 'upload_files' is not in camel case camelcase + 192:3 error Identifier 'delete_users' is not in camel case camelcase + 193:3 error Identifier 'remove_users' is not in camel case camelcase + 194:3 error Identifier 'view_stats' is not in camel case camelcase + 197:2 error Identifier 'single_user_site' is not in camel case camelcase + 200:2 error Identifier 'is_customizable' is not in camel case camelcase + 201:2 error Identifier 'is_previewable' is not in camel case camelcase + 214:2 error Identifier 'blog_id' is not in camel case camelcase + 215:2 error Identifier 'cart_key' is not in camel case camelcase + 217:2 error Identifier 'is_coupon_applied' is not in camel case camelcase + 218:2 error Identifier 'has_bundle_credit' is not in camel case camelcase + 219:2 error Identifier 'next_domain_is_free' is not in camel case camelcase + 221:2 error Identifier 'total_cost' is not in camel case camelcase + 223:2 error Identifier 'total_cost_display' is not in camel case camelcase + 226:2 error Identifier 'allowed_payment_methods' is not in camel case camelcase + 231:2 error Identifier 'create_new_blog' is not in camel case camelcase + 233:2 error Identifier 'client_metadata' is not in camel case camelcase + 233:21 error Identifier 'last_server_response_date' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/jetpack-connect/test/plans.js + 89:6 error Identifier 'is_automated_transfer' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/layout/community-translator/invitation-utils.js + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 123:6 error Identifier 'enable_translator' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/config-elements/button-row.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/config-elements/combine-tours.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/config-elements/continue.js + 84:1 error Expected indentation of 4 tabs but found 5 indent + 85:1 error Expected indentation of 3 tabs but found 4 indent + 95:7 error className should follow CSS namespace guidelines (expected config-elements__ prefix or to be in one of index.js, index.jsx, main.js, main.jsx) wpcalypso/jsx-classname-namespace + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/config-elements/link.js + 22:9 error className should follow CSS namespace guidelines (expected config-elements__ prefix or to be in one of index.js, index.jsx, main.js, main.jsx) wpcalypso/jsx-classname-namespace + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/config-elements/make-tour.js + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/config-parsing.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/config.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/context-types.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/index.js + 39:39 error Identifier 'tour_version' is not in camel case camelcase + 40:16 error Identifier 'tour_version' is not in camel case camelcase + 44:5 error Identifier 'tour_version' is not in camel case camelcase + 44:5 error Identifier 'tour_version' is not in camel case camelcase + 54:5 error Identifier 'tour_version' is not in camel case camelcase + 66:38 error Identifier 'tour_version' is not in camel case camelcase + 71:5 error Identifier 'tour_version' is not in camel case camelcase + 71:5 error Identifier 'tour_version' is not in camel case camelcase + 78:4 error Identifier 'tour_version' is not in camel case camelcase + 78:4 error Identifier 'tour_version' is not in camel case camelcase + 97:10 error className should follow CSS namespace guidelines (expected guided-tours__ prefix) wpcalypso/jsx-classname-namespace + 121:12 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/tours/activity-log-tour.js + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + 89:1 error Line 89 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/tours/design-showcase-welcome-tour.js + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/tours/editor-basics-tour.js + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/tours/main-tour.js + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 144:1 error Line 144 exceeds the maximum line length of 100 max-len + 166:1 error Line 166 exceeds the maximum line length of 100 max-len + 184:1 error Line 184 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/tours/media-basics-tour.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 113:1 error Line 113 exceeds the maximum line length of 100 max-len + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 136:1 error Line 136 exceeds the maximum line length of 100 max-len + 152:1 error Line 152 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/tours/simple-payments-tour.js + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/tours/site-title-tour.js + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 97:1 error Line 97 exceeds the maximum line length of 100 max-len + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 119:1 error Line 119 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/tours/theme-sheet-welcome-tour.js + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + 112:1 error Line 112 exceeds the maximum line length of 100 max-len + 131:1 error Line 131 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/tours/tutorial-site-preview-tour.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/layout/guided-tours/wait.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/layout/nux-welcome/index.js + 22:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/abtest/index.js + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + 138:1 error Line 138 exceeds the maximum line length of 100 max-len + 210:1 error Line 210 exceeds the maximum line length of 100 max-len + 296:3 error Identifier 'abtest_name' is not in camel case camelcase + 297:3 error Identifier 'abtest_variation' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/abtest/test/index.js + 96:40 error Identifier 'mockedTest_20160627' is not in camel case camelcase + 111:1 error Line 111 exceeds the maximum line length of 100 max-len + 138:1 error Line 138 exceeds the maximum line length of 100 max-len + 166:1 error Line 166 exceeds the maximum line length of 100 max-len + 194:1 error Line 194 exceeds the maximum line length of 100 max-len + 212:1 error Line 212 exceeds the maximum line length of 100 max-len + 237:1 error Line 237 exceeds the maximum line length of 100 max-len + 241:1 error Line 241 exceeds the maximum line length of 100 max-len + 246:1 error Line 246 exceeds the maximum line length of 100 max-len + 248:1 error Line 248 exceeds the maximum line length of 100 max-len + 269:1 error Line 269 exceeds the maximum line length of 100 max-len + 285:1 error Line 285 exceeds the maximum line length of 100 max-len + 290:1 error Line 290 exceeds the maximum line length of 100 max-len + 295:1 error Line 295 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/accept/index.js + 16:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/accept/test/index.js + 22:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/accessible-focus/index.js + 2:1 error Unexpected var, use let or const instead no-var + 3:1 error Line 3 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/account-password-data/index.js + 99:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/ads/earnings-store.js + 20:1 error Unexpected var, use let or const instead no-var + 61:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/ads/settings-store.js + 21:1 error Unexpected var, use let or const instead no-var + 34:3 error Unexpected var, use let or const instead no-var + 82:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/ads/test/lib/mock-actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/ads/test/lib/mock-earnings.js + 4:3 error Identifier 'total_amount_owed' is not in camel case camelcase + 5:3 error Identifier 'total_earnings' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/ads/test/lib/mock-settings.js + 5:3 error Identifier 'who_owns' is not in camel case camelcase + 6:3 error Identifier 'us_resident' is not in camel case camelcase + 7:3 error Identifier 'taxid_last4' is not in camel case camelcase + 14:3 error Identifier 'show_to_logged_in' is not in camel case camelcase + 16:3 error Identifier 'optimized_ads' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/ads/test/lib/mock-site.js + 12:2 error Identifier 'is_following' is not in camel case camelcase + 13:2 error Identifier 'is_private' is not in camel case camelcase + 22:2 error Identifier 'post_count' is not in camel case camelcase + 23:2 error Identifier 'single_user_site' is not in camel case camelcase + 25:2 error Identifier 'subscribers_count' is not in camel case camelcase + 28:2 error Identifier 'jp_version' is not in camel case camelcase + 29:2 error Identifier 'user_can_manage' is not in camel case camelcase + 31:2 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/ads/test/stores.js + 53:4 error Unexpected var, use let or const instead no-var + 63:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/ads/tos-store.js + 21:1 error Unexpected var, use let or const instead no-var + 73:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/ads/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/analytics/ad-tracking.js + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 130:9 error Identifier 'criteo_q' is not in camel case camelcase + 145:9 error Identifier '_linkedin_data_partner_id' is not in camel case camelcase + 166:3 error Identifier 'account_id' is not in camel case camelcase + 167:3 error Identifier 'customer_id' is not in camel case camelcase + 168:3 error Identifier 'tag_action' is not in camel case camelcase + 441:5 error Identifier 'google_conversion_id' is not in camel case camelcase + 442:5 error Identifier 'google_remarketing_only' is not in camel case camelcase + 496:4 error Identifier 'google_conversion_id' is not in camel case camelcase + 497:4 error Identifier 'google_custom_params' is not in camel case camelcase + 498:4 error Identifier 'google_remarketing_only' is not in camel case camelcase + 534:4 error Identifier 'product_slug' is not in camel case camelcase + 535:4 error Identifier 'free_trial' is not in camel case camelcase + 644:6 error Identifier 'google_conversion_id' is not in camel case camelcase + 647:6 error Identifier 'google_conversion_label' is not in camel case camelcase + 650:6 error Identifier 'google_conversion_value' is not in camel case camelcase + 651:6 error Identifier 'google_conversion_currency' is not in camel case camelcase + 652:6 error Identifier 'google_custom_params' is not in camel case camelcase + 653:7 error Identifier 'product_slug' is not in camel case camelcase + 654:7 error Identifier 'user_id' is not in camel case camelcase + 655:7 error Identifier 'order_id' is not in camel case camelcase + 657:6 error Identifier 'google_remarketing_only' is not in camel case camelcase + 666:5 error Identifier 'product_slug' is not in camel case camelcase + 668:5 error Identifier 'user_id' is not in camel case camelcase + 669:5 error Identifier 'order_id' is not in camel case camelcase + 678:5 error Identifier 'content_name' is not in camel case camelcase + 679:5 error Identifier 'content_type' is not in camel case camelcase + 680:5 error Identifier 'content_ids' is not in camel case camelcase + 681:5 error Identifier 'num_items' is not in camel case camelcase + 682:5 error Identifier 'order_id' is not in camel case camelcase + 689:5 error Identifier 'order_id' is not in camel case camelcase + 690:5 error Identifier 'product_slug' is not in camel case camelcase + 691:5 error Identifier 'order_price' is not in camel case camelcase + 769:3 error Identifier 'product_slugs' is not in camel case camelcase + 771:3 error Identifier 'currency_code' is not in camel case camelcase + 772:3 error Identifier 'user_id' is not in camel case camelcase + 773:3 error Identifier 'order_id' is not in camel case camelcase + 995:1 error Line 995 exceeds the maximum line length of 100 max-len + 1195:1 error Line 1195 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/analytics/index.js + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 135:1 error Line 135 exceeds the maximum line length of 100 max-len + 149:1 error Line 149 exceeds the maximum line length of 100 max-len + 224:1 error Line 224 exceeds the maximum line length of 100 max-len + 249:12 error Identifier 'last_pageview_path_with_count' is not in camel case camelcase + 252:12 error Identifier 'this_pageview_path_with_count' is not in camel case camelcase + 277:1 error Line 277 exceeds the maximum line length of 100 max-len + 281:1 error Line 281 exceeds the maximum line length of 100 max-len + 298:1 error Line 298 exceeds the maximum line length of 100 max-len + 302:1 error Line 302 exceeds the maximum line length of 100 max-len + 314:5 error Identifier 'do_not_track' is not in camel case camelcase + 336:1 error Line 336 exceeds the maximum line length of 100 max-len + 369:1 error Line 369 exceeds the maximum line length of 100 max-len + 383:1 error Line 383 exceeds the maximum line length of 100 max-len + 441:1 error Line 441 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/analytics/statsd.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/analytics/super-props.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:4 error Identifier 'site_count' is not in camel case camelcase + 16:4 error Identifier 'site_id_label' is not in camel case camelcase + 24:5 error Identifier 'blog_id' is not in camel case camelcase + 28:5 error Identifier 'blog_lang' is not in camel case camelcase + 30:5 error Identifier 'site_id_label' is not in camel case camelcase + 31:5 error Identifier 'site_plan_id' is not in camel case camelcase + 32:5 error Identifier 'site_post_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/analytics/test/mocks/config/index.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'key' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/analytics/test/mocks/lib/load-script/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/analytics/test/statsd.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/analytics/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/apple-pay/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:3 error Identifier 'can_make_payments_with_active_card' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/auth-code-request-store/actions.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 6:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/auth-code-request-store/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/auth-code-request-store/index.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 24:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/auth-code-request-store/test/index.js + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + 55:36 error Identifier 'error_description' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/build-url/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/cart-values/cart-items.js + 55:1 error 'lib/plans/constants' import is duplicated no-duplicate-imports + 182:1 error Line 182 exceeds the maximum line length of 100 max-len + 282:1 error Line 282 exceeds the maximum line length of 100 max-len + 293:1 error Line 293 exceeds the maximum line length of 100 max-len + 310:51 error Identifier 'product_slug' is not in camel case camelcase + 355:1 error Line 355 exceeds the maximum line length of 100 max-len + 358:35 error Identifier 'product_slug' is not in camel case camelcase + 396:3 error Identifier 'product_slug' is not in camel case camelcase + 397:3 error Identifier 'free_trial' is not in camel case camelcase + 447:4 error Identifier 'product_slug' is not in camel case camelcase + 456:3 error Identifier 'product_slug' is not in camel case camelcase + 472:3 error Identifier 'is_domain_registration' is not in camel case camelcase + 531:34 error Identifier 'google_apps_users' is not in camel case camelcase + 537:34 error Identifier 'google_apps_users' is not in camel case camelcase + 545:39 error Identifier 'google_apps_registration_data' is not in camel case camelcase + 557:3 error Identifier 'product_slug' is not in camel case camelcase + 563:3 error Identifier 'product_slug' is not in camel case camelcase + 569:3 error Identifier 'product_slug' is not in camel case camelcase + 575:3 error Identifier 'product_slug' is not in camel case camelcase + 581:3 error Identifier 'product_slug' is not in camel case camelcase + 587:3 error Identifier 'product_slug' is not in camel case camelcase + 593:3 error Identifier 'product_slug' is not in camel case camelcase + 636:33 error Identifier 'free_trial' is not in camel case camelcase + 643:1 error Line 643 exceeds the maximum line length of 100 max-len + 646:35 error Identifier 'is_domain_registration' is not in camel case camelcase + 653:1 error Line 653 exceeds the maximum line length of 100 max-len + 656:35 error Identifier 'product_slug' is not in camel case camelcase + 740:1 error Line 740 exceeds the maximum line length of 100 max-len + 743:35 error Identifier 'product_slug' is not in camel case camelcase + 747:33 error Identifier 'is_domain_registration' is not in camel case camelcase + 751:1 error Line 751 exceeds the maximum line length of 100 max-len + 755:1 error Line 755 exceeds the maximum line length of 100 max-len + 761:4 error Identifier 'product_slug' is not in camel case camelcase + 771:1 error Line 771 exceeds the maximum line length of 100 max-len + 889:1 error Line 889 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/cart-values/index.js + 31:26 error Identifier 'blog_id' is not in camel case camelcase + 38:4 error Identifier 'is_coupon_applied' is not in camel case camelcase + 66:2 error Unexpected var, use let or const instead no-var + 113:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/cart-values/test/index.js + 36:5 error Unexpected var, use let or const instead no-var + 51:5 error Unexpected var, use let or const instead no-var + 54:7 error Identifier 'blog_id' is not in camel case camelcase + 64:5 error Unexpected var, use let or const instead no-var + 67:6 error Identifier 'blog_id' is not in camel case camelcase + 72:6 error Identifier 'blog_id' is not in camel case camelcase + 83:4 error Unexpected var, use let or const instead no-var + 86:5 error Identifier 'blog_id' is not in camel case camelcase + 92:5 error Identifier 'blog_id' is not in camel case camelcase + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 102:6 error Identifier 'blog_id' is not in camel case camelcase + 106:6 error Identifier 'blog_id' is not in camel case camelcase + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 117:4 error Unexpected var, use let or const instead no-var + 120:5 error Identifier 'blog_id' is not in camel case camelcase + 124:1 error Line 124 exceeds the maximum line length of 100 max-len + 127:5 error Identifier 'blog_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/cart/store/cart-analytics.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/cart/store/cart-synchronizer.js + 25:3 error Identifier 'client_metadata' is not in camel case camelcase + 36:11 error Identifier 'last_server_response_date' is not in camel case camelcase + 43:30 error Identifier 'product_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/cart/store/index.js + 25:1 error Unexpected var, use let or const instead no-var + 29:1 error Unexpected var, use let or const instead no-var + 31:3 error Unexpected var, use let or const instead no-var + 76:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/cart/store/test/cart-synchronizer.js + 14:1 error Unexpected var, use let or const instead no-var + 16:1 error Unexpected var, use let or const instead no-var + 32:4 error Unexpected var, use let or const instead no-var + 41:4 error Unexpected var, use let or const instead no-var + 64:4 error Unexpected var, use let or const instead no-var + 76:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/cart/store/test/fake-wpcom/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 18:2 error Unexpected var, use let or const instead no-var + 38:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/catch-js-errors/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 33:5 error Identifier 'previous_paths' is not in camel case camelcase + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 81:29 error Identifier 'previous_paths' is not in camel case camelcase + 82:23 error Identifier 'calypso_path' is not in camel case camelcase + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 128:1 error Line 128 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/catch-js-errors/log.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 12:1 error Missing JSDoc parameter description for 'loggerObject' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/checkout/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/connected-applications-data/index.js + 19:1 error Missing JSDoc @returns for function valid-jsdoc + 34:1 error Missing JSDoc return type valid-jsdoc + 75:1 error Missing JSDoc parameter type for 'int' valid-jsdoc + 75:1 error Expected JSDoc for 'connectionID' but found 'int' valid-jsdoc + 75:1 error Missing JSDoc for parameter 'callback' valid-jsdoc + 101:1 error Missing JSDoc parameter type for 'int' valid-jsdoc + 101:1 error Missing JSDoc @returns for function valid-jsdoc + 101:1 error Expected JSDoc for 'connectionID' but found 'int' valid-jsdoc + 107:2 error Unexpected var, use let or const instead no-var + 113:43 error 'application' is already declared in the upper scope no-shadow + +/Users/seear/repos/wp-calypso/client/lib/countries-list/index.js + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/create-config/index.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 35:5 error Strings must use singlequote quotes + 42:3 error Unexpected console statement no-console + 59:1 error Expected JSDoc for 'data' but found 'feature' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/create-config/test/index.js + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 58:10 error Strings must use singlequote quotes + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + 64:10 error Strings must use singlequote quotes + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/create-selector/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/create-selector/test/index.js + 21:34 error Identifier 'site_ID' is not in camel case camelcase + 42:6 error Identifier 'site_ID' is not in camel case camelcase + 43:6 error Identifier 'global_ID' is not in camel case camelcase + 52:5 error Identifier 'site_ID' is not in camel case camelcase + 53:5 error Identifier 'global_ID' is not in camel case camelcase + 64:6 error Identifier 'site_ID' is not in camel case camelcase + 65:6 error Identifier 'global_ID' is not in camel case camelcase + 90:11 error Unexpected console statement no-console + 98:6 error Identifier 'site_ID' is not in camel case camelcase + 99:6 error Identifier 'global_ID' is not in camel case camelcase + 104:6 error Identifier 'site_ID' is not in camel case camelcase + 105:6 error Identifier 'global_ID' is not in camel case camelcase + 118:5 error Identifier 'site_ID' is not in camel case camelcase + 119:5 error Identifier 'global_ID' is not in camel case camelcase + 131:6 error Identifier 'site_ID' is not in camel case camelcase + 132:6 error Identifier 'global_ID' is not in camel case camelcase + 144:6 error Identifier 'site_ID' is not in camel case camelcase + 145:6 error Identifier 'global_ID' is not in camel case camelcase + 150:6 error Identifier 'site_ID' is not in camel case camelcase + 151:6 error Identifier 'global_ID' is not in camel case camelcase + 160:5 error Identifier 'site_ID' is not in camel case camelcase + 161:5 error Identifier 'global_ID' is not in camel case camelcase + 169:1 error Line 169 exceeds the maximum line length of 100 max-len + 174:6 error Identifier 'site_ID' is not in camel case camelcase + 175:6 error Identifier 'global_ID' is not in camel case camelcase + 194:6 error Identifier 'site_ID' is not in camel case camelcase + 195:6 error Identifier 'global_ID' is not in camel case camelcase + 217:6 error Identifier 'site_ID' is not in camel case camelcase + 218:6 error Identifier 'global_ID' is not in camel case camelcase + 236:6 error Identifier 'site_ID' is not in camel case camelcase + 237:6 error Identifier 'global_ID' is not in camel case camelcase + 249:6 error Identifier 'site_ID' is not in camel case camelcase + 250:6 error Identifier 'global_ID' is not in camel case camelcase + 255:6 error Identifier 'site_ID' is not in camel case camelcase + 256:6 error Identifier 'global_ID' is not in camel case camelcase + 276:1 error Line 276 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/credit-card-details/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/credit-card-details/masking.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 9:1 error Unexpected var, use let or const instead no-var + 33:10 error Unnecessary 'else' after 'return' no-else-return + 43:3 error Unexpected var, use let or const instead no-var + 70:2 error Unexpected var, use let or const instead no-var + 79:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/credit-card-details/test/index.js + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/credit-card-details/validation.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 150:1 error Line 150 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/css-hot-reload/index.js + 24:1 error Missing JSDoc return description valid-jsdoc + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + 36:1 error Missing JSDoc return description valid-jsdoc + 36:1 error Missing JSDoc for parameter 'href' valid-jsdoc + 36:1 error Missing JSDoc for parameter 'changedFiles' valid-jsdoc + 64:7 error Unexpected console statement no-console + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + 78:5 error Unexpected console statement no-console + 81:5 error Unexpected console statement no-console + +/Users/seear/repos/wp-calypso/client/lib/data-poller/index.js + 18:2 error Unexpected var, use let or const instead no-var + 40:2 error Unexpected var, use let or const instead no-var + 52:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/data-poller/poller.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Unexpected var, use let or const instead no-var + 57:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/design-preview/index.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/design-preview/updaters/site-title.js + 1:1 error Missing JSDoc for parameter 'previewDoc' valid-jsdoc + 1:1 error Missing JSDoc for parameter 'customizations' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/desktop/index.js + 28:1 error Unexpected var, use let or const instead no-var + 30:1 error Unexpected var, use let or const instead no-var + 65:3 error Unexpected var, use let or const instead no-var + 166:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/directly/test/index.js + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/domains/assembler.js + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/domains/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/domains/dns/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + 171:4 error Identifier 'protected_field' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/domains/dns/store.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/domains/dns/test/reducer.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/domains/email-forwarding/reducer.js + 116:5 error Identifier 'forward_address' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/domains/email-forwarding/store.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/domains/email-forwarding/test/data/index.js + 15:3 error Identifier 'forward_address' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/domains/email-forwarding/test/reducer.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/domains/email-forwarding/test/store.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 108:6 error Identifier 'forward_address' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/domains/google-apps-users/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 13:3 error Unexpected var, use let or const instead no-var + 23:2 error Unexpected var, use let or const instead no-var + 28:4 error Unexpected var, use let or const instead no-var + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/domains/nameservers/store.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/domains/nameservers/test/store.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + 75:1 error Line 75 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/domains/reducer.js + 47:2 error Unexpected var, use let or const instead no-var + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/domains/registration/availability-messages.js + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + 132:1 error Line 132 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/domains/site-redirect/store.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/domains/store.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/domains/test/assembler.js + 19:4 error Identifier 'has_registration' is not in camel case camelcase + 20:4 error Identifier 'primary_domain' is not in camel case camelcase + 22:4 error Identifier 'wpcom_domain' is not in camel case camelcase + 28:4 error Identifier 'has_registration' is not in camel case camelcase + 29:4 error Identifier 'primary_domain' is not in camel case camelcase + 34:4 error Identifier 'wpcom_domain' is not in camel case camelcase + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/domains/wapi-domain-info/assembler.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'status' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/domains/wapi-domain-info/store.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/domains/whois/protected-contact-information.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/domains/whois/store.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/domains/whois/test/assembler.js + 81:3 error Identifier 'country_code' is not in camel case camelcase + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + 101:1 error Line 101 exceeds the maximum line length of 100 max-len + 107:1 error Line 107 exceeds the maximum line length of 100 max-len + 114:1 error Line 114 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 123:1 error Line 123 exceeds the maximum line length of 100 max-len + 135:1 error Line 135 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/domains/whois/test/store.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/email-followers/actions.js + 18:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/email-followers/store.js + 80:11 error Identifier 'avatar_URL' is not in camel case camelcase + 173:1 error Line 173 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/email-followers/test/lib/mock-actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/email-followers/test/lib/mock-email-followers.js + 5:2 error Identifier 'total_email' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/email-followers/test/lib/mock-more-email-followers.js + 5:2 error Identifier 'total_email' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/email-followers/test/lib/mock-site.js + 12:2 error Identifier 'is_following' is not in camel case camelcase + 13:2 error Identifier 'is_private' is not in camel case camelcase + 22:2 error Identifier 'post_count' is not in camel case camelcase + 23:2 error Identifier 'single_user_site' is not in camel case camelcase + 25:2 error Identifier 'subscribers_count' is not in camel case camelcase + 28:2 error Identifier 'jp_version' is not in camel case camelcase + 29:2 error Identifier 'user_can_manage' is not in camel case camelcase + 31:2 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/email-followers/test/store.js + 23:2 error Unexpected var, use let or const instead no-var + 40:4 error Unexpected var, use let or const instead no-var + 45:4 error Unexpected var, use let or const instead no-var + 51:4 error Unexpected var, use let or const instead no-var + 60:4 error Unexpected var, use let or const instead no-var + 76:4 error Unexpected var, use let or const instead no-var + 86:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/embeds/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 23:5 error Identifier 'embed_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/embeds/list-store.js + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/feed-post-store/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:39 error 'FeedPostActions' is never reassigned. Use 'const' instead prefer-const + 17:1 error 'feedPostFetcher' is never reassigned. Use 'const' instead prefer-const + 42:1 error 'blogPostFetcher' is never reassigned. Use 'const' instead prefer-const + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/feed-post-store/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/feed-post-store/index.js + 87:6 error Identifier 'status_code' is not in camel case camelcase + 122:7 error Identifier 'feed_item_ID' is not in camel case camelcase + 164:4 error Identifier 'site_ID' is not in camel case camelcase + 178:4 error Identifier 'feed_ID' is not in camel case camelcase + 179:4 error Identifier 'feed_item_ID' is not in camel case camelcase + 226:8 error Identifier 'site_ID' is not in camel case camelcase + 228:8 error Identifier 'is_external' is not in camel case camelcase + 254:3 error Identifier 'feed_ID' is not in camel case camelcase + 255:3 error Identifier 'feed_item_ID' is not in camel case camelcase + 256:3 error Identifier 'site_ID' is not in camel case camelcase + 267:8 error Identifier 'site_ID' is not in camel case camelcase + 269:8 error Identifier 'is_external' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/feed-post-store/test/index.js + 15:1 error Unexpected var, use let or const instead no-var + 37:23 error Identifier 'feed_ID' is not in camel case camelcase + 52:23 error Identifier 'site_ID' is not in camel case camelcase + 77:23 error Identifier 'global_ID' is not in camel case camelcase + 88:5 error Identifier 'feed_id' is not in camel case camelcase + 89:5 error Identifier 'feed_item_ID' is not in camel case camelcase + 116:5 error Identifier 'feed_id' is not in camel case camelcase + 117:5 error Identifier 'feed_item_ID' is not in camel case camelcase + 119:5 error Identifier 'site_ID' is not in camel case camelcase + 146:5 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/feed-post-store/test/mocks/lib/post-normalizer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/feed-stream-store/actions.js + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/feed-stream-store/feed-stream.js + 177:1 error Line 177 exceeds the maximum line length of 100 max-len + 210:1 error Line 210 exceeds the maximum line length of 100 max-len + 280:1 error Line 280 exceeds the maximum line length of 100 max-len + 337:1 error Line 337 exceeds the maximum line length of 100 max-len + 338:1 error Line 338 exceeds the maximum line length of 100 max-len + 393:1 error Line 393 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/feed-stream-store/index.js + 72:9 error Identifier 'page_handle' is not in camel case camelcase + 128:19 error Identifier 'rec_result' is not in camel case camelcase + 295:11 error Identifier 'alg_prefix' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/feed-stream-store/paged-stream.js + 143:1 error Line 143 exceeds the maximum line length of 100 max-len + 171:1 error Line 171 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/feed-stream-store/post-key.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'post' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/feed-stream-store/test/index.js + 70:16 error Identifier 'feed_ID' is not in camel case camelcase + 70:39 error Identifier 'feed_ID' is not in camel case camelcase + 81:6 error Identifier 'date_range' is not in camel case camelcase + 85:17 error Identifier 'feed_ID' is not in camel case camelcase + 85:40 error Identifier 'feed_ID' is not in camel case camelcase + 99:6 error Identifier 'date_range' is not in camel case camelcase + 105:8 error Identifier 'feed_ID' is not in camel case camelcase + 110:8 error Identifier 'feed_ID' is not in camel case camelcase + 115:8 error Identifier 'feed_ID' is not in camel case camelcase + 120:8 error Identifier 'feed_ID' is not in camel case camelcase + 147:7 error Identifier 'feed_ID' is not in camel case camelcase + 148:7 error Identifier 'feed_ID' is not in camel case camelcase + 149:7 error Identifier 'feed_ID' is not in camel case camelcase + 150:7 error Identifier 'feed_ID' is not in camel case camelcase + 164:24 error Identifier 'feed_ID' is not in camel case camelcase + 181:24 error Identifier 'feed_ID' is not in camel case camelcase + 183:51 error Identifier 'feed_ID' is not in camel case camelcase + 188:24 error Identifier 'feed_ID' is not in camel case camelcase + 189:51 error Identifier 'feed_ID' is not in camel case camelcase + 191:51 error Identifier 'feed_ID' is not in camel case camelcase + 202:24 error Identifier 'feed_ID' is not in camel case camelcase + 203:51 error Identifier 'feed_ID' is not in camel case camelcase + 205:51 error Identifier 'feed_ID' is not in camel case camelcase + 227:1 error Line 227 exceeds the maximum line length of 100 max-len + 230:6 error Identifier 'site_name' is not in camel case camelcase + 231:6 error Identifier 'site_URL' is not in camel case camelcase + 238:1 error Line 238 exceeds the maximum line length of 100 max-len + 241:6 error Identifier 'site_name' is not in camel case camelcase + 242:6 error Identifier 'site_URL' is not in camel case camelcase + 249:1 error Line 249 exceeds the maximum line length of 100 max-len + 252:6 error Identifier 'site_name' is not in camel case camelcase + 253:6 error Identifier 'site_URL' is not in camel case camelcase + 260:1 error Line 260 exceeds the maximum line length of 100 max-len + 263:6 error Identifier 'site_name' is not in camel case camelcase + 264:6 error Identifier 'site_URL' is not in camel case camelcase + 271:1 error Line 271 exceeds the maximum line length of 100 max-len + 274:6 error Identifier 'site_name' is not in camel case camelcase + 275:6 error Identifier 'site_URL' is not in camel case camelcase + 280:6 error Identifier 'site_name' is not in camel case camelcase + 281:6 error Identifier 'site_URL' is not in camel case camelcase + 284:6 error Identifier 'site_URL' is not in camel case camelcase + 292:3 warning Skipped test jest/no-disabled-tests + 295:1 error Line 295 exceeds the maximum line length of 100 max-len + 296:1 error Line 296 exceeds the maximum line length of 100 max-len + 300:3 warning Skipped test jest/no-disabled-tests + 305:1 error Line 305 exceeds the maximum line length of 100 max-len + 312:3 warning Skipped test jest/no-disabled-tests + 322:3 warning Skipped test jest/no-disabled-tests + 327:6 error Identifier 'site_name' is not in camel case camelcase + 328:6 error Identifier 'site_URL' is not in camel case camelcase + 335:3 warning Skipped test jest/no-disabled-tests + 345:6 error Identifier 'site_name' is not in camel case camelcase + 346:6 error Identifier 'site_URL' is not in camel case camelcase + 370:8 error Identifier 'site_ID' is not in camel case camelcase + 373:8 error Identifier 'last_comment_date_gmt' is not in camel case camelcase + 382:1 error Line 382 exceeds the maximum line length of 100 max-len + 385:7 error Identifier 'site_ID' is not in camel case camelcase + 387:7 error Identifier 'last_comment_date_gmt' is not in camel case camelcase + 397:7 error Identifier 'site_ID' is not in camel case camelcase + 400:7 error Identifier 'last_comment_date_gmt' is not in camel case camelcase + 410:7 error Identifier 'last_comment_date_gmt' is not in camel case camelcase + 419:7 error Identifier 'site_ID' is not in camel case camelcase + 422:7 error Identifier 'last_comment_date_gmt' is not in camel case camelcase + 432:7 error Identifier 'last_comment_date_gmt' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/feed-stream-store/test/mocks/lib/post-normalizer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/follow-list/index.js + 14:1 error Missing JSDoc @returns for function valid-jsdoc + 26:1 error Missing JSDoc @returns for function valid-jsdoc + 26:1 error Missing JSDoc for parameter 'object' valid-jsdoc + 30:2 error Unexpected var, use let or const instead no-var + 38:45 error Identifier 'site_id' is not in camel case camelcase + 39:28 error Identifier 'site_id' is not in camel case camelcase + 39:28 error Identifier 'site_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/follow-list/site.js + 17:1 error Missing JSDoc @returns for function valid-jsdoc + 17:1 error Missing JSDoc for parameter 'args' valid-jsdoc + 27:7 error Identifier 'site_id' is not in camel case camelcase + 27:22 error Identifier 'site_id' is not in camel case camelcase + 28:7 error Identifier 'is_following' is not in camel case camelcase + 28:27 error Identifier 'is_following' is not in camel case camelcase + 29:7 error Identifier 'blog_domain' is not in camel case camelcase + 29:26 error Identifier 'blog_domain' is not in camel case camelcase + 44:8 error Identifier 'is_following' is not in camel case camelcase + 61:8 error Identifier 'is_following' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/follow-list/test/index.js + 6:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 12:2 error Unexpected var, use let or const instead no-var + 18:32 error Identifier 'site_id' is not in camel case camelcase + 18:51 error Identifier 'is_following' is not in camel case camelcase + 24:23 error Identifier 'site_id' is not in camel case camelcase + 24:42 error Identifier 'is_following' is not in camel case camelcase + 29:23 error Identifier 'site_id' is not in camel case camelcase + 29:42 error Identifier 'is_following' is not in camel case camelcase + 34:23 error Identifier 'site_id' is not in camel case camelcase + 34:42 error Identifier 'is_following' is not in camel case camelcase + 36:23 error Identifier 'site_id' is not in camel case camelcase + 36:42 error Identifier 'is_following' is not in camel case camelcase + 37:23 error Identifier 'site_id' is not in camel case camelcase + 37:42 error Identifier 'is_following' is not in camel case camelcase + 53:5 error Unexpected var, use let or const instead no-var + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 61:5 error Unexpected var, use let or const instead no-var + 62:10 error Identifier 'is_following' is not in camel case camelcase + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + 72:5 error Unexpected var, use let or const instead no-var + 73:10 error Identifier 'is_following' is not in camel case camelcase + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 81:5 error Unexpected var, use let or const instead no-var + 82:10 error Identifier 'is_following' is not in camel case camelcase + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/followers/actions.js + 18:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/followers/store.js + 18:1 error Unexpected var, use let or const instead no-var + 26:1 error Unexpected var, use let or const instead no-var + 29:3 error Unexpected var, use let or const instead no-var + 46:3 error Unexpected var, use let or const instead no-var + 57:7 error 'followers' is never reassigned. Use 'const' instead prefer-const + 80:11 error Identifier 'avatar_URL' is not in camel case camelcase + 89:2 error Unexpected var, use let or const instead no-var + 159:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/followers/test/lib/mock-actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/followers/test/lib/mock-site.js + 12:2 error Identifier 'is_following' is not in camel case camelcase + 13:2 error Identifier 'is_private' is not in camel case camelcase + 22:2 error Identifier 'post_count' is not in camel case camelcase + 23:2 error Identifier 'single_user_site' is not in camel case camelcase + 25:2 error Identifier 'subscribers_count' is not in camel case camelcase + 28:2 error Identifier 'jp_version' is not in camel case camelcase + 29:2 error Identifier 'user_can_manage' is not in camel case camelcase + 31:2 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/followers/test/lib/mock-wpcom-followers1.js + 6:2 error Identifier 'total_wpcom' is not in camel case camelcase + 7:2 error Identifier 'total_email' is not in camel case camelcase + 14:4 error Identifier 'display_name' is not in camel case camelcase + 21:4 error Identifier 'display_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/followers/test/lib/mock-wpcom-followers2.js + 6:2 error Identifier 'total_wpcom' is not in camel case camelcase + 7:2 error Identifier 'total_email' is not in camel case camelcase + 14:4 error Identifier 'display_name' is not in camel case camelcase + 21:4 error Identifier 'display_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/followers/test/store.js + 23:2 error Unexpected var, use let or const instead no-var + 40:4 error Unexpected var, use let or const instead no-var + 45:4 error Unexpected var, use let or const instead no-var + 51:4 error Unexpected var, use let or const instead no-var + 60:4 error Unexpected var, use let or const instead no-var + 76:4 error Unexpected var, use let or const instead no-var + 86:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/form-state/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 27:2 error Unexpected var, use let or const instead no-var + 84:3 error Unexpected var, use let or const instead no-var + 95:3 error Unexpected var, use let or const instead no-var + 122:3 error Unexpected var, use let or const instead no-var + 137:3 error Unexpected var, use let or const instead no-var + 176:2 error Unexpected var, use let or const instead no-var + 230:4 error Unexpected var, use let or const instead no-var + 315:2 error Unexpected var, use let or const instead no-var + 321:2 error Unexpected var, use let or const instead no-var + 327:2 error Unexpected var, use let or const instead no-var + 338:2 error Unexpected var, use let or const instead no-var + 348:2 error Unexpected var, use let or const instead no-var + 363:1 error Line 363 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/form-state/store/async-initialize.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/form-state/store/core.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/form-state/test/index.js + 15:2 error Unexpected var, use let or const instead no-var + 27:2 error Unexpected var, use let or const instead no-var + 33:4 error Unexpected var, use let or const instead no-var + 38:4 error Unexpected var, use let or const instead no-var + 54:5 error Unexpected var, use let or const instead no-var + 62:4 error Unexpected var, use let or const instead no-var + 77:5 error Unexpected var, use let or const instead no-var + 96:5 error Unexpected var, use let or const instead no-var + 121:6 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/format-currency/index.js + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 68:1 error Expected indentation of 4 tabs but found 5 indent + 69:1 error Expected indentation of 4 tabs but found 5 indent + 70:1 error Expected indentation of 4 tabs but found 5 indent + 71:1 error Expected indentation of 3 tabs but found 4 indent + +/Users/seear/repos/wp-calypso/client/lib/formatting/decode-entities/browser.js + 2:5 error 'element' is never reassigned. Use 'const' instead prefer-const + 12:6 error 'decoded' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/formatting/index.js + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 68:2 error 'words' is never reassigned. Use 'const' instead prefer-const + 77:2 error 'endWords' is never reassigned. Use 'const' instead prefer-const + 100:6 error Identifier 'preserve_linebreaks' is not in camel case camelcase + 101:3 error Identifier 'preserve_br' is not in camel case camelcase + 115:3 error Identifier 'preserve_linebreaks' is not in camel case camelcase + 123:3 error Identifier 'preserve_br' is not in camel case camelcase + 173:7 error Identifier 'preserve_linebreaks' is not in camel case camelcase + 177:7 error Identifier 'preserve_br' is not in camel case camelcase + 189:6 error Identifier 'preserve_linebreaks' is not in camel case camelcase + 190:3 error Identifier 'preserve_br' is not in camel case camelcase + 198:3 error Identifier 'preserve_linebreaks' is not in camel case camelcase + 208:3 error Identifier 'preserve_br' is not in camel case camelcase + 267:7 error Identifier 'preserve_linebreaks' is not in camel case camelcase + 272:7 error Identifier 'preserve_br' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/formatting/test/index.js + 153:1 error Line 153 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/geocoding/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/google-apps/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/happychat/connection-ng.js + 51:29 error Identifier 'signer_user_id' is not in camel case camelcase + 57:19 error Identifier 'signer_user_id' is not in camel case camelcase + 57:19 error Identifier 'signer_user_id' is not in camel case camelcase + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 60:33 error Identifier 'signer_user_id' is not in camel case camelcase + 60:33 error Identifier 'signer_user_id' is not in camel case camelcase + 158:1 error Line 158 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/happychat/connection.js + 34:25 error Identifier 'signer_user_id' is not in camel case camelcase + 46:41 error Identifier 'signer_user_id' is not in camel case camelcase + 46:41 error Identifier 'signer_user_id' is not in camel case camelcase + 48:32 error Identifier 'signer_user_id' is not in camel case camelcase + 48:32 error Identifier 'signer_user_id' is not in camel case camelcase + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 96:33 error Identifier 'event_type' is not in camel case camelcase + 121:33 error Identifier 'event_type' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/happychat/test/index.js + 27:9 error Identifier 'signer_user_id' is not in camel case camelcase + 39:5 error Identifier 'signer_user_id' is not in camel case camelcase + 39:5 error Identifier 'signer_user_id' is not in camel case camelcase + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 60:56 error Identifier 'signer_user_id' is not in camel case camelcase + 60:56 error Identifier 'signer_user_id' is not in camel case camelcase + 74:14 error Identifier 'signer_user_id' is not in camel case camelcase + 74:14 error Identifier 'signer_user_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/help-search/actions.js + 18:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/help-search/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/help-search/store.js + 20:1 error Unexpected var, use let or const instead no-var + 22:1 error Unexpected var, use let or const instead no-var + 23:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/help-search/test/lib/mock-actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/help-search/test/store.js + 9:2 error Unexpected var, use let or const instead no-var + 18:4 error Unexpected var, use let or const instead no-var + 25:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/highlight/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:1 error Missing JSDoc for parameter 'wrapperNode' valid-jsdoc + 11:1 error Missing JSDoc @returns for function valid-jsdoc + 11:1 error Missing JSDoc for parameter 'innerHtml' valid-jsdoc + 15:2 error Unexpected var, use let or const instead no-var + 21:2 error Unexpected var, use let or const instead no-var + 33:1 error Missing JSDoc for parameter 'wrapperNode' valid-jsdoc + 33:1 error Missing JSDoc for parameter 'term' valid-jsdoc + 33:1 error Missing JSDoc for parameter 'node' valid-jsdoc + 37:2 error Unexpected var, use let or const instead no-var + 70:1 error Missing JSDoc for parameter 'node' valid-jsdoc + 70:1 error Missing JSDoc for parameter 'term' valid-jsdoc + 70:1 error Missing JSDoc for parameter 'wrapperNode' valid-jsdoc + 74:2 error Unexpected var, use let or const instead no-var + 79:9 error Unexpected var, use let or const instead no-var + 103:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/highlight/test/index.js + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 29:4 error Unexpected var, use let or const instead no-var + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/human-date/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 25:7 error 'minutes' is never reassigned. Use 'const' instead prefer-const + 35:7 error 'hours' is never reassigned. Use 'const' instead prefer-const + 45:7 error 'days' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/i18n-utils/browser.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/i18n-utils/node.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/i18n-utils/switch-locale.js + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 20:2 error Unexpected var, use let or const instead no-var + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/i18n-utils/test/utils.js + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/i18n-utils/utils.js + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/importer/actions.js + 177:6 error 'importerId' is never reassigned. Use 'const' instead prefer-const + 201:8 error 'importerId' is never reassigned. Use 'const' instead prefer-const + 201:32 error 'siteId' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/importer/common.js + 62:1 error Expected indentation of 6 tabs but found 7 indent + 63:1 error Expected indentation of 5 tabs but found 6 indent + +/Users/seear/repos/wp-calypso/client/lib/importer/store.js + 70:8 error 'action' is never reassigned. Use 'const' instead prefer-const + 109:1 error Line 109 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/impure-lodash/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/infinite-list/actions.js + 32:10 error 'storedPositions' is never reassigned. Use 'const' instead prefer-const + 52:10 error 'storedScroll' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/infinite-list/positions-store.js + 20:1 error Unexpected var, use let or const instead no-var + 31:2 error Unexpected var, use let or const instead no-var + 43:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/infinite-list/scroll-store.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 12:1 error Unexpected var, use let or const instead no-var + 20:2 error Unexpected var, use let or const instead no-var + 28:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/interval/index.js + 19:1 error Missing JSDoc for parameter 'props' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/invites/actions.js + 74:8 error Identifier 'send_verification_email' is not in camel case camelcase + 80:53 error Identifier 'send_verification_email' is not in camel case camelcase + 80:53 error Identifier 'send_verification_email' is not in camel case camelcase + 144:1 error Line 144 exceeds the maximum line length of 100 max-len + 169:1 error Line 169 exceeds the maximum line length of 100 max-len + 189:1 error Line 189 exceeds the maximum line length of 100 max-len + 207:1 error Line 207 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/invites/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/invites/reducers/test/invites-create-validation.js + 24:5 error Identifier 'error_data' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/invites/stores/invites-accept-validation.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/invites/stores/invites-create-validation.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/invites/stores/invites-list.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/invites/stores/invites-sent.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/invites/stores/test/invites-list.js + 26:7 error Identifier 'invite_key' is not in camel case camelcase + 44:7 error Identifier 'invite_key' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/keyboard-shortcuts/index.js + 33:1 error Missing JSDoc for parameter 'keyBindings' valid-jsdoc + 33:1 error Missing JSDoc @returns for function valid-jsdoc + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 42:29 error 'keyBindings' is already declared in the upper scope no-shadow + 68:55 error 'keyBindings' is already declared in the upper scope no-shadow + 69:2 error Unexpected var, use let or const instead no-var + 86:2 error Unexpected var, use let or const instead no-var + 98:37 error 'keys' is already declared in the upper scope no-shadow + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 119:1 error Line 119 exceeds the maximum line length of 100 max-len + 127:5 error Unexpected var, use let or const instead no-var + 162:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/keyboard-shortcuts/test/index.js + 15:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/keyboard-shortcuts/test/key-bindings.js + 20:3 error Unexpected var, use let or const instead no-var + 29:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/like-store/actions.js + 18:1 error Unexpected var, use let or const instead no-var + 37:1 error Unexpected var, use let or const instead no-var + 38:2 error Expected JSDoc for 'siteId' but found 'Site' valid-jsdoc + 38:2 error Expected JSDoc for 'postId' but found 'Post' valid-jsdoc + 53:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/like-store/like-store.js + 19:1 error Unexpected var, use let or const instead no-var + 32:2 error Expected JSDoc for 'postId' but found 'Post' valid-jsdoc + 32:2 error Expected JSDoc for 'siteId' but found 'Site' valid-jsdoc + 41:3 error Unexpected var, use let or const instead no-var + 53:2 error Expected JSDoc for 'siteId' but found 'Site' valid-jsdoc + 53:2 error Expected JSDoc for 'postId' but found 'Post' valid-jsdoc + 62:3 error Unexpected var, use let or const instead no-var + 74:2 error Expected JSDoc for 'postId' but found 'Post' valid-jsdoc + 74:2 error Missing JSDoc return description valid-jsdoc + 74:2 error Expected JSDoc for 'siteId' but found 'Site' valid-jsdoc + 83:3 error Unexpected var, use let or const instead no-var + 107:3 error Unexpected var, use let or const instead no-var + 110:3 error Unexpected var, use let or const instead no-var + 113:4 error Identifier 'i_like' is not in camel case camelcase + 138:3 error Unexpected var, use let or const instead no-var + 144:5 error Identifier 'i_like' is not in camel case camelcase + 151:3 error Unexpected var, use let or const instead no-var + 155:12 error Identifier 'i_like' is not in camel case camelcase + 163:3 error Unexpected var, use let or const instead no-var + 167:12 error Identifier 'i_like' is not in camel case camelcase + 194:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/like-store/test/index.js + 10:2 error Unexpected var, use let or const instead no-var + 32:5 error Identifier 'post_ID' is not in camel case camelcase + 33:5 error Identifier 'site_ID' is not in camel case camelcase + 52:5 error Identifier 'post_ID' is not in camel case camelcase + 53:5 error Identifier 'site_ID' is not in camel case camelcase + 71:5 error Identifier 'post_ID' is not in camel case camelcase + 72:5 error Identifier 'site_ID' is not in camel case camelcase + 73:5 error Identifier 'i_like' is not in camel case camelcase + 87:5 error Identifier 'post_ID' is not in camel case camelcase + 88:5 error Identifier 'site_ID' is not in camel case camelcase + 101:5 error Identifier 'post_ID' is not in camel case camelcase + 102:5 error Identifier 'site_ID' is not in camel case camelcase + 117:5 error Identifier 'site_ID' is not in camel case camelcase + 118:5 error Identifier 'post_ID' is not in camel case camelcase + 131:5 error Identifier 'i_like' is not in camel case camelcase + 132:5 error Identifier 'like_count' is not in camel case camelcase + 133:5 error Identifier 'site_ID' is not in camel case camelcase + 134:5 error Identifier 'post_ID' is not in camel case camelcase + 147:5 error Identifier 'i_like' is not in camel case camelcase + 148:5 error Identifier 'like_count' is not in camel case camelcase + 149:5 error Identifier 'site_ID' is not in camel case camelcase + 150:5 error Identifier 'post_ID' is not in camel case camelcase + 164:5 error Identifier 'likes_enabled' is not in camel case camelcase + 165:5 error Identifier 'is_external' is not in camel case camelcase + 166:5 error Identifier 'site_ID' is not in camel case camelcase + 168:5 error Identifier 'like_count' is not in camel case camelcase + 182:5 error Identifier 'is_external' is not in camel case camelcase + 183:5 error Identifier 'site_ID' is not in camel case camelcase + 185:5 error Identifier 'like_count' is not in camel case camelcase + 211:5 error Identifier 'likes_enabled' is not in camel case camelcase + 212:5 error Identifier 'is_external' is not in camel case camelcase + 213:5 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/load-script/index.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/load-script/test/callback-handler.js + 127:1 error Line 127 exceeds the maximum line length of 100 max-len + 229:1 error Line 229 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/load-script/test/index.js + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/local-list/index.js + 17:1 error Missing JSDoc @returns for function valid-jsdoc + 17:1 error Missing JSDoc for parameter 'options' valid-jsdoc + 37:1 error Missing JSDoc return type valid-jsdoc + 44:2 error Unexpected var, use let or const instead no-var + 48:1 error Missing JSDoc return type valid-jsdoc + 59:1 error Missing JSDoc parameter type for 'key' valid-jsdoc + 59:1 error Missing JSDoc parameter type for 'value' valid-jsdoc + 59:1 error Missing JSDoc parameter description for 'value' valid-jsdoc + 68:2 error Unexpected var, use let or const instead no-var + 88:1 error Missing JSDoc parameter type for 'key' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/local-list/test/index.js + 181:1 error Line 181 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/local-storage/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/locale-suggestions/actions.js + 13:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/locale-suggestions/index.js + 15:1 error Unexpected var, use let or const instead no-var + 17:1 error Unexpected var, use let or const instead no-var + 34:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/localforage/localforage-bypass.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 24:13 error 'i' is never reassigned. Use 'const' instead prefer-const + 44:15 error 'key' is never reassigned. Use 'const' instead prefer-const + 93:16 error 'key' is never reassigned. Use 'const' instead prefer-const + 119:15 error 'key' is never reassigned. Use 'const' instead prefer-const + 145:15 error 'key' is never reassigned. Use 'const' instead prefer-const + 216:9 error 'db' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/media-serialization/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/media-serialization/strategies/api.js + 23:6 error 'normalized' is never reassigned. Use 'const' instead prefer-const + 26:5 error Unquoted reserved word 'transient' used as key quote-props + +/Users/seear/repos/wp-calypso/client/lib/media-serialization/strategies/dom.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 33:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/media-serialization/strategies/index.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/media-serialization/strategies/shortcode.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/media-serialization/strategies/string.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/media-serialization/strategies/unknown.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/media-serialization/test/index.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 57:8 error 'img' is never reassigned. Use 'const' instead prefer-const + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 95:8 error 'img' is never reassigned. Use 'const' instead prefer-const + 114:8 error 'img' is never reassigned. Use 'const' instead prefer-const + 137:5 error Identifier 'post_ID' is not in camel case camelcase + 139:5 error Identifier 'mime_type' is not in camel case camelcase + 154:52 error Unquoted reserved word 'transient' used as key quote-props + +/Users/seear/repos/wp-calypso/client/lib/media/actions.js + 43:2 error Unexpected var, use let or const instead no-var + 117:4 error Identifier 'parent_id' is not in camel case camelcase + 213:2 error Unexpected var, use let or const instead no-var + 256:1 error Line 256 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/media/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 139:2 error Unquoted reserved word 'class' used as key quote-props + +/Users/seear/repos/wp-calypso/client/lib/media/library-selected-store.js + 41:2 error Unexpected var, use let or const instead no-var + 67:2 error Unexpected var, use let or const instead no-var + 97:2 error Unexpected var, use let or const instead no-var + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/media/list-store.js + 29:2 error Unexpected var, use let or const instead no-var + 46:2 error Unexpected var, use let or const instead no-var + 66:2 error Unexpected var, use let or const instead no-var + 130:2 error Unexpected var, use let or const instead no-var + 149:1 error Line 149 exceeds the maximum line length of 100 max-len + 188:2 error Unexpected var, use let or const instead no-var + 204:4 error Identifier 'page_handle' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/media/store.js + 96:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/media/test/actions.js + 107:1 error Line 107 exceeds the maximum line length of 100 max-len + 162:1 error Line 162 exceeds the maximum line length of 100 max-len + 216:1 error Line 216 exceeds the maximum line length of 100 max-len + 245:7 error Unquoted reserved word 'transient' used as key quote-props + 259:7 error Identifier 'parent_id' is not in camel case camelcase + 273:7 error Identifier 'parent_id' is not in camel case camelcase + 298:1 error Line 298 exceeds the maximum line length of 100 max-len + 409:1 error Line 409 exceeds the maximum line length of 100 max-len + 419:1 error Line 419 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/media/test/fixtures/index.js + 27:10 error Identifier 'next_page' is not in camel case camelcase + 30:30 error Identifier 'mime_type' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/media/test/library-selected-store.js + 15:1 error Unexpected var, use let or const instead no-var + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 101:1 error Line 101 exceeds the maximum line length of 100 max-len + 141:1 error Line 141 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/media/test/list-store.js + 21:3 error Identifier 'mime_type' is not in camel case camelcase + 25:11 error Identifier 'next_page' is not in camel case camelcase + 127:1 error Line 127 exceeds the maximum line length of 100 max-len + 143:4 error Unexpected var, use let or const instead no-var + 159:4 error Unexpected var, use let or const instead no-var + 199:5 error Identifier 'page_handle' is not in camel case camelcase + 204:4 error Unexpected var, use let or const instead no-var + 204:18 error Identifier 'mime_type' is not in camel case camelcase + 213:7 error Identifier 'page_handle' is not in camel case camelcase + 221:4 error Unexpected var, use let or const instead no-var + 221:18 error Identifier 'mime_type' is not in camel case camelcase + 228:6 error Identifier 'page_handle' is not in camel case camelcase + 272:33 error Identifier 'mime_type' is not in camel case camelcase + 279:3 error Unexpected var, use let or const instead no-var + 286:4 error Unexpected var, use let or const instead no-var + 291:1 error Line 291 exceeds the maximum line length of 100 max-len + 292:4 error Unexpected var, use let or const instead no-var + 301:4 error Unexpected var, use let or const instead no-var + 309:1 error Line 309 exceeds the maximum line length of 100 max-len + 310:4 error Unexpected var, use let or const instead no-var + 318:1 error Line 318 exceeds the maximum line length of 100 max-len + 319:4 error Unexpected var, use let or const instead no-var + 320:49 error Identifier 'mime_type' is not in camel case camelcase + 328:4 error Unexpected var, use let or const instead no-var + 329:33 error Identifier 'mime_type' is not in camel case camelcase + 337:4 error Unexpected var, use let or const instead no-var + 338:33 error Identifier 'mime_type' is not in camel case camelcase + 345:1 error Line 345 exceeds the maximum line length of 100 max-len + 361:33 error Identifier 'mime_type' is not in camel case camelcase + 381:33 error Identifier 'mime_type' is not in camel case camelcase + 402:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/media/test/mocks/lib/wp.js + 22:4 error Unquoted reserved word 'delete' used as key quote-props + +/Users/seear/repos/wp-calypso/client/lib/media/test/store.js + 19:11 error Identifier 'next_page' is not in camel case camelcase + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/media/test/utils.js + 35:2 error Identifier 'mime_type' is not in camel case camelcase + 38:2 error Unquoted reserved word 'transient' used as key quote-props + 43:2 error Identifier 'mime_type' is not in camel case camelcase + 46:2 error Unquoted reserved word 'transient' used as key quote-props + 51:2 error Identifier 'mime_type' is not in camel case camelcase + 59:3 error Unexpected var, use let or const instead no-var + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + 71:4 error Unexpected var, use let or const instead no-var + 83:4 error Unexpected var, use let or const instead no-var + 89:4 error Unexpected var, use let or const instead no-var + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + 99:4 error Unexpected var, use let or const instead no-var + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 110:4 error Unexpected var, use let or const instead no-var + 120:4 error Unexpected var, use let or const instead no-var + 128:4 error Unexpected var, use let or const instead no-var + 154:1 error Line 154 exceeds the maximum line length of 100 max-len + 182:1 error Line 182 exceeds the maximum line length of 100 max-len + 208:38 error Identifier 'mime_type' is not in camel case camelcase + 227:1 error Line 227 exceeds the maximum line length of 100 max-len + 240:1 error Line 240 exceeds the maximum line length of 100 max-len + 260:1 error Line 260 exceeds the maximum line length of 100 max-len + 260:4 error Unexpected var, use let or const instead no-var + 260:29 error Identifier 'mime_type' is not in camel case camelcase + 260:66 error Identifier 'mime_type' is not in camel case camelcase + 266:4 error Unexpected var, use let or const instead no-var + 266:29 error Identifier 'mime_type' is not in camel case camelcase + 273:3 error Unexpected var, use let or const instead no-var + 321:4 error Unexpected var, use let or const instead no-var + 328:4 error Unexpected var, use let or const instead no-var + 330:6 error Identifier 'allowed_file_types' is not in camel case camelcase + 340:3 error Unexpected var, use let or const instead no-var + 342:5 error Identifier 'allowed_file_types' is not in camel case camelcase + 355:4 error Unexpected var, use let or const instead no-var + 362:4 error Unexpected var, use let or const instead no-var + 367:7 error Identifier 'jetpack_version' is not in camel case camelcase + 376:4 error Unexpected var, use let or const instead no-var + 383:4 error Unexpected var, use let or const instead no-var + 394:5 error Identifier 'max_upload_size' is not in camel case camelcase + 401:5 error Identifier 'jetpack_version' is not in camel case camelcase + 402:5 error Identifier 'max_upload_size' is not in camel case camelcase + 419:7 error Identifier 'max_upload_size' is not in camel case camelcase + 427:1 error Line 427 exceeds the maximum line length of 100 max-len + 430:20 error Identifier 'mime_type' is not in camel case camelcase + 436:1 error Line 436 exceeds the maximum line length of 100 max-len + 438:19 error Identifier 'mime_type' is not in camel case camelcase + 443:7 error Identifier 'jetpack_version' is not in camel case camelcase + 444:7 error Identifier 'max_upload_size' is not in camel case camelcase + 452:1 error Line 452 exceeds the maximum line length of 100 max-len + 455:20 error Identifier 'mime_type' is not in camel case camelcase + 461:1 error Line 461 exceeds the maximum line length of 100 max-len + 463:19 error Identifier 'mime_type' is not in camel case camelcase + 467:7 error Identifier 'jetpack_version' is not in camel case camelcase + 468:7 error Identifier 'max_upload_size' is not in camel case camelcase + 476:1 error Line 476 exceeds the maximum line length of 100 max-len + 481:1 error Line 481 exceeds the maximum line length of 100 max-len + 496:43 error Identifier 'videopress_guid' is not in camel case camelcase + 500:43 error Identifier 'videopress_guid' is not in camel case camelcase + 548:4 error Unexpected var, use let or const instead no-var + 550:6 error Identifier 'image_thumbnail_width' is not in camel case camelcase + 551:6 error Identifier 'image_thumbnail_height' is not in camel case camelcase + 562:4 error Unexpected var, use let or const instead no-var + 571:4 error Unexpected var, use let or const instead no-var + 582:1 error Line 582 exceeds the maximum line length of 100 max-len + 582:4 error Unexpected var, use let or const instead no-var + 588:4 error Unexpected var, use let or const instead no-var + 598:4 error Unexpected var, use let or const instead no-var + 609:18 error Identifier 'author_ID' is not in camel case camelcase + 611:1 error Line 611 exceeds the maximum line length of 100 max-len + 615:6 error Identifier 'delete_posts' is not in camel case camelcase + 622:1 error Line 622 exceeds the maximum line length of 100 max-len + 626:6 error Identifier 'delete_posts' is not in camel case camelcase + 633:1 error Line 633 exceeds the maximum line length of 100 max-len + 637:6 error Identifier 'delete_others_posts' is not in camel case camelcase + 644:1 error Line 644 exceeds the maximum line length of 100 max-len + 648:6 error Identifier 'delete_others_posts' is not in camel case camelcase + 662:19 error Unquoted reserved word 'transient' used as key quote-props + +/Users/seear/repos/wp-calypso/client/lib/media/test/validation-store.js + 12:4 error Identifier 'allowed_file_types' is not in camel case camelcase + 13:4 error Identifier 'max_upload_size' is not in camel case camelcase + 100:3 error Unexpected var, use let or const instead no-var + 107:1 error Line 107 exceeds the maximum line length of 100 max-len + 150:3 error Unexpected var, use let or const instead no-var + 176:3 error Unexpected var, use let or const instead no-var + 182:1 error Line 182 exceeds the maximum line length of 100 max-len + 188:1 error Line 188 exceeds the maximum line length of 100 max-len + 192:1 error Line 192 exceeds the maximum line length of 100 max-len + 202:4 error Unexpected var, use let or const instead no-var + 208:4 error Unexpected var, use let or const instead no-var + 221:4 error Unexpected var, use let or const instead no-var + 228:4 error Unexpected var, use let or const instead no-var + 255:4 error Unexpected var, use let or const instead no-var + 275:4 error Unexpected var, use let or const instead no-var + 295:4 error Unexpected var, use let or const instead no-var + 304:1 error Line 304 exceeds the maximum line length of 100 max-len + 315:4 error Unexpected var, use let or const instead no-var + 326:4 error Unexpected var, use let or const instead no-var + 340:4 error Unexpected var, use let or const instead no-var + 362:1 error Line 362 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/media/utils.js + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 137:3 error Unexpected var, use let or const instead no-var + 208:3 error Unexpected var, use let or const instead no-var + 211:4 error Unexpected var, use let or const instead no-var + 398:3 error Unexpected var, use let or const instead no-var + 421:3 error Unexpected var, use let or const instead no-var + 493:1 error Line 493 exceeds the maximum line length of 100 max-len + 540:4 error Unquoted reserved word 'transient' used as key quote-props + 550:5 error Identifier 'mime_type' is not in camel case camelcase + 558:5 error Identifier 'mime_type' is not in camel case camelcase + 578:5 error Identifier 'mime_type' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/media/validation-store.js + 14:1 error 'lib/sites-list' import is restricted from being used no-restricted-imports + 59:2 error Unexpected var, use let or const instead no-var + 158:2 error Unexpected var, use let or const instead no-var + 170:5 error Unexpected var, use let or const instead no-var + 201:1 error Line 201 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/mixins/analytics/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 48:8 error Identifier 'domain_name' is not in camel case camelcase + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 61:6 error Identifier 'domain_name' is not in camel case camelcase + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + 74:6 error Identifier 'domain_name' is not in camel case camelcase + 75:6 error Identifier 'number_of_licenses' is not in camel case camelcase + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + 88:6 error Identifier 'user_index' is not in camel case camelcase + 104:7 error Identifier 'domain_name' is not in camel case camelcase + 105:7 error Identifier 'user_index' is not in camel case camelcase + 164:1 error Line 164 exceeds the maximum line length of 100 max-len + 180:6 error Identifier 'domain_name' is not in camel case camelcase + 193:6 error Identifier 'domain_name' is not in camel case camelcase + 211:7 error Identifier 'domain_name' is not in camel case camelcase + 226:1 error Line 226 exceeds the maximum line length of 100 max-len + 227:6 error Identifier 'domain_name' is not in camel case camelcase + 239:1 error Line 239 exceeds the maximum line length of 100 max-len + 241:6 error Identifier 'domain_name' is not in camel case camelcase + 259:7 error Identifier 'domain_name' is not in camel case camelcase + 276:8 error Identifier 'domain_name' is not in camel case camelcase + 290:8 error Identifier 'domain_name' is not in camel case camelcase + 306:8 error Identifier 'domain_name' is not in camel case camelcase + 318:1 error Line 318 exceeds the maximum line length of 100 max-len + 319:6 error Identifier 'domain_name' is not in camel case camelcase + 342:1 error Line 342 exceeds the maximum line length of 100 max-len + 348:1 error Line 348 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/mixins/data-observe/test/index.js + 29:4 error Unexpected var, use let or const instead no-var + 36:4 error Unexpected var, use let or const instead no-var + 46:4 error Unexpected var, use let or const instead no-var + 53:4 error Unexpected var, use let or const instead no-var + 63:4 error Unexpected var, use let or const instead no-var + 70:4 error Unexpected var, use let or const instead no-var + 80:4 error Unexpected var, use let or const instead no-var + 87:4 error Unexpected var, use let or const instead no-var + 99:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/mixins/emitter/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/mixins/infinite-scroll/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 37:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/mixins/searchable/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 30:2 error Unexpected var, use let or const instead no-var + 31:3 error Unexpected var, use let or const instead no-var + 66:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/mixins/searchable/test/index.js + 14:1 error Unexpected var, use let or const instead no-var + 15:2 error Unexpected var, use let or const instead no-var + 21:6 error Unquoted reserved word 'public' used as key quote-props + 22:6 error Unquoted reserved word 'private' used as key quote-props + 33:6 error Unquoted reserved word 'public' used as key quote-props + 34:6 error Unquoted reserved word 'private' used as key quote-props + 54:4 error Unexpected var, use let or const instead no-var + 64:4 error Unexpected var, use let or const instead no-var + 74:4 error Unexpected var, use let or const instead no-var + 83:4 error Unexpected var, use let or const instead no-var + 93:4 error Unexpected var, use let or const instead no-var + 107:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/mixins/url-search/index.js + 33:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/network-connection/index.js + 22:1 error Unexpected var, use let or const instead no-var + 27:2 error Missing JSDoc return description valid-jsdoc + 34:2 error Missing JSDoc for parameter 'reduxStore' valid-jsdoc + 38:3 error Unexpected var, use let or const instead no-var + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 127:2 error Missing JSDoc return description valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/network-connection/test/index.js + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/notification-settings-store/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/notification-settings-store/test/index.js + 54:6 error Identifier 'blog_id' is not in camel case camelcase + 56:7 error Identifier 'new_comment' is not in camel case camelcase + 57:7 error Identifier 'comment_like' is not in camel case camelcase + 58:7 error Identifier 'post_like' is not in camel case camelcase + 64:7 error Identifier 'new_comment' is not in camel case camelcase + 65:7 error Identifier 'comment_like' is not in camel case camelcase + 66:7 error Identifier 'post_like' is not in camel case camelcase + 89:6 error Identifier 'new_comment' is not in camel case camelcase + 90:6 error Identifier 'comment_like' is not in camel case camelcase + 91:6 error Identifier 'post_like' is not in camel case camelcase + 97:6 error Identifier 'new_comment' is not in camel case camelcase + 98:6 error Identifier 'comment_like' is not in camel case camelcase + 99:6 error Identifier 'post_like' is not in camel case camelcase + 120:5 error Identifier 'new_comment' is not in camel case camelcase + 121:5 error Identifier 'comment_like' is not in camel case camelcase + 139:6 error Identifier 'blog_id' is not in camel case camelcase + 140:18 error Identifier 'new_comment' is not in camel case camelcase + 141:15 error Identifier 'new_comment' is not in camel case camelcase + 143:9 error Identifier 'device_id' is not in camel case camelcase + 143:25 error Identifier 'new_comment' is not in camel case camelcase + 144:9 error Identifier 'device_id' is not in camel case camelcase + 144:26 error Identifier 'new_comment' is not in camel case camelcase + 145:9 error Identifier 'device_id' is not in camel case camelcase + 145:27 error Identifier 'new_comment' is not in camel case camelcase + 149:6 error Identifier 'blog_id' is not in camel case camelcase + 150:18 error Identifier 'new_comment' is not in camel case camelcase + 151:15 error Identifier 'new_comment' is not in camel case camelcase + 153:9 error Identifier 'device_id' is not in camel case camelcase + 153:25 error Identifier 'new_comment' is not in camel case camelcase + 154:9 error Identifier 'device_id' is not in camel case camelcase + 154:26 error Identifier 'new_comment' is not in camel case camelcase + 155:9 error Identifier 'device_id' is not in camel case camelcase + 155:27 error Identifier 'new_comment' is not in camel case camelcase + 221:17 error Identifier 'new_comment' is not in camel case camelcase + 222:14 error Identifier 'new_comment' is not in camel case camelcase + 224:8 error Identifier 'device_id' is not in camel case camelcase + 224:24 error Identifier 'new_comment' is not in camel case camelcase + 225:8 error Identifier 'device_id' is not in camel case camelcase + 225:25 error Identifier 'new_comment' is not in camel case camelcase + 226:8 error Identifier 'device_id' is not in camel case camelcase + 226:26 error Identifier 'new_comment' is not in camel case camelcase + 263:2 error Test suite title is used multiple times jest/no-identical-title + 266:5 error Identifier 'new_comment' is not in camel case camelcase + 267:5 error Identifier 'comment_like' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/notification-settings-store/toggle-state.js + 9:1 error Line 9 exceeds the maximum line length of 100 max-len + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/oauth-store/actions.js + 14:1 error './constants' import is duplicated no-duplicate-imports + 17:44 error Identifier 'auth_code' is not in camel case camelcase + 24:32 error Identifier 'auth_code' is not in camel case camelcase + 24:32 error Identifier 'auth_code' is not in camel case camelcase + 56:4 error Identifier 'calypso_oauth_login_error' is not in camel case camelcase + 57:4 error Identifier 'calypso_oauth_login' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/oauth-store/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/oauth-store/index.js + 16:1 error './constants' import is duplicated no-duplicate-imports + 30:6 error 'stateChanges' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/oauth-store/test/index.js + 61:6 error Identifier 'error_description' is not in camel case camelcase + 82:6 error Identifier 'error_description' is not in camel case camelcase + 107:7 error Identifier 'access_token' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/oauth-token/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 17:6 error 'cookies' is never reassigned. Use 'const' instead prefer-const + 38:6 error 'cookies' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/oauth2-clients.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/olark-events/index.js + 17:1 error Unexpected var, use let or const instead no-var + 40:1 error Unexpected var, use let or const instead no-var + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 75:1 error Line 75 exceeds the maximum line length of 100 max-len + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/olark-events/test/index.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/olark-events/test/mock/olark.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/olark-store/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/olark-store/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/olark/index.js + 40:1 error 'lib/olark-store' import is duplicated no-duplicate-imports + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 90:3 error Unexpected var, use let or const instead no-var + 133:1 error Line 133 exceeds the maximum line length of 100 max-len + 146:1 error Line 146 exceeds the maximum line length of 100 max-len + 162:1 error Line 162 exceeds the maximum line length of 100 max-len + 169:1 error Line 169 exceeds the maximum line length of 100 max-len + 187:1 error Line 187 exceeds the maximum line length of 100 max-len + 201:3 error Unexpected var, use let or const instead no-var + 202:1 error Line 202 exceeds the maximum line length of 100 max-len + 236:1 error Line 236 exceeds the maximum line length of 100 max-len + 271:1 error Line 271 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/path-to-section/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/paths/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/paths/login/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 49:25 error Identifier 'redirect_to' is not in camel case camelcase + 53:25 error Identifier 'email_address' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/paths/login/test/index.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/paths/test/index.js + 17:1 error Unexpected var, use let or const instead no-var + 25:4 error Unexpected var, use let or const instead no-var + 31:4 error Unexpected var, use let or const instead no-var + 39:4 error Unexpected var, use let or const instead no-var + 45:4 error Unexpected var, use let or const instead no-var + 53:4 error Unexpected var, use let or const instead no-var + 59:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/people/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 9:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/people/log-store.js + 17:1 error Unexpected var, use let or const instead no-var + 43:2 error Unexpected var, use let or const instead no-var + 67:2 error Unexpected var, use let or const instead no-var + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 97:2 error Unexpected var, use let or const instead no-var + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/people/test/fixtures/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 17:4 error Identifier 'order_by' is not in camel case camelcase + 35:4 error Identifier 'order_by' is not in camel case camelcase + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/people/test/fixtures/site.js + 12:2 error Identifier 'is_following' is not in camel case camelcase + 13:2 error Identifier 'is_private' is not in camel case camelcase + 22:2 error Identifier 'post_count' is not in camel case camelcase + 23:2 error Identifier 'single_user_site' is not in camel case camelcase + 25:2 error Identifier 'subscribers_count' is not in camel case camelcase + 28:2 error Identifier 'jp_version' is not in camel case camelcase + 29:2 error Identifier 'user_can_manage' is not in camel case camelcase + 31:2 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/people/test/log-store.js + 66:4 error 'errors' is never reassigned. Use 'const' instead prefer-const + 88:4 error 'inProgress' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/perfmon/index.js + 34:5 error 'activePlaceholders' is never reassigned. Use 'const' instead prefer-const + 58:2 error Unexpected var, use let or const instead no-var + 93:3 error Unexpected var, use let or const instead no-var + 95:28 error Strings must use singlequote quotes + 112:2 error Unexpected var, use let or const instead no-var + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 127:2 error Unexpected var, use let or const instead no-var + 134:2 error Unexpected var, use let or const instead no-var + 135:2 error Unexpected var, use let or const instead no-var + 148:2 error Unexpected var, use let or const instead no-var + 183:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/plans/constants.js + 195:1 error Line 195 exceeds the maximum line length of 100 max-len + 200:1 error Line 200 exceeds the maximum line length of 100 max-len + 247:1 error Line 247 exceeds the maximum line length of 100 max-len + 252:1 error Line 252 exceeds the maximum line length of 100 max-len + 312:1 error Line 312 exceeds the maximum line length of 100 max-len + 318:1 error Line 318 exceeds the maximum line length of 100 max-len + 326:1 error Line 326 exceeds the maximum line length of 100 max-len + 331:1 error Line 331 exceeds the maximum line length of 100 max-len + 339:1 error Line 339 exceeds the maximum line length of 100 max-len + 442:1 error Line 442 exceeds the maximum line length of 100 max-len + 479:1 error Line 479 exceeds the maximum line length of 100 max-len + 487:1 error Line 487 exceeds the maximum line length of 100 max-len + 522:1 error Line 522 exceeds the maximum line length of 100 max-len + 965:1 error Line 965 exceeds the maximum line length of 100 max-len + 988:1 error Line 988 exceeds the maximum line length of 100 max-len + 997:1 error Line 997 exceeds the maximum line length of 100 max-len + 1018:1 error Line 1018 exceeds the maximum line length of 100 max-len + 1081:1 error Line 1081 exceeds the maximum line length of 100 max-len + 1122:1 error Line 1122 exceeds the maximum line length of 100 max-len + 1127:1 error Line 1127 exceeds the maximum line length of 100 max-len + 1198:1 error Line 1198 exceeds the maximum line length of 100 max-len + 1206:1 error Line 1206 exceeds the maximum line length of 100 max-len + 1213:1 error Line 1213 exceeds the maximum line length of 100 max-len + 1220:1 error Line 1220 exceeds the maximum line length of 100 max-len + 1241:1 error Line 1241 exceeds the maximum line length of 100 max-len + 1274:1 error Line 1274 exceeds the maximum line length of 100 max-len + 1290:1 error Line 1290 exceeds the maximum line length of 100 max-len + 1297:1 error Line 1297 exceeds the maximum line length of 100 max-len + 1305:1 error Line 1305 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/plans/index.js + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 156:1 error Line 156 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/plans/test/can-upgrade-to-plan.js + 27:11 error Identifier 'product_slug' is not in camel case camelcase + 120:5 error Identifier 'is_automated_transfer' is not in camel case camelcase + 123:5 error Identifier 'product_slug' is not in camel case camelcase + 149:1 error Line 149 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/plans/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/plugins/actions.js + 32:3 error 'nextAction' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/plugins/log-store.js + 17:1 error Unexpected var, use let or const instead no-var + 23:2 error Unexpected var, use let or const instead no-var + 68:2 error Unexpected var, use let or const instead no-var + 105:3 error Unexpected var, use let or const instead no-var + 107:4 error Unexpected var, use let or const instead no-var + 134:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/plugins/store.js + 34:1 error Unexpected var, use let or const instead no-var + 64:2 error Unexpected var, use let or const instead no-var + 111:1 error Line 111 exceeds the maximum line length of 100 max-len + 121:3 error Unexpected var, use let or const instead no-var + 128:4 error Unexpected var, use let or const instead no-var + 150:3 error Unexpected var, use let or const instead no-var + 159:4 error Unexpected var, use let or const instead no-var + 205:3 error Unexpected var, use let or const instead no-var + 215:3 error Unexpected var, use let or const instead no-var + 230:1 error Line 230 exceeds the maximum line length of 100 max-len + 231:10 error 'pluginSite' is never reassigned. Use 'const' instead prefer-const + 252:3 error Unexpected var, use let or const instead no-var + 325:1 error Line 325 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/plugins/test/actions.js + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 62:46 error Identifier 'manage_options' is not in camel case camelcase + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 72:46 error Identifier 'manage_options' is not in camel case camelcase + 88:6 error Identifier 'user_can_manage' is not in camel case camelcase + 89:22 error Identifier 'manage_options' is not in camel case camelcase + 104:6 error Identifier 'user_can_manage' is not in camel case camelcase + 105:22 error Identifier 'manage_options' is not in camel case camelcase + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/plugins/test/fixtures/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 132:4 error Identifier 'author_url' is not in camel case camelcase + 138:4 error Identifier 'plugin_url' is not in camel case camelcase + 194:4 error Identifier 'author_url' is not in camel case camelcase + 200:4 error Identifier 'plugin_url' is not in camel case camelcase + 246:4 error Identifier 'author_url' is not in camel case camelcase + 252:4 error Identifier 'plugin_url' is not in camel case camelcase + 287:4 error Identifier 'author_url' is not in camel case camelcase + 293:4 error Identifier 'plugin_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/plugins/test/fixtures/multi-site.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:3 error Identifier 'manage_options' is not in camel case camelcase + 21:2 error Identifier 'is_following' is not in camel case camelcase + 22:2 error Identifier 'is_private' is not in camel case camelcase + 29:3 error Identifier 'admin_url' is not in camel case camelcase + 30:3 error Identifier 'allowed_file_types' is not in camel case camelcase + 31:3 error Identifier 'background_color' is not in camel case camelcase + 32:3 error Identifier 'created_at' is not in camel case camelcase + 33:3 error Identifier 'default_comment_status' is not in camel case camelcase + 34:3 error Identifier 'default_likes_enabled' is not in camel case camelcase + 35:3 error Identifier 'default_ping_status' is not in camel case camelcase + 36:3 error Identifier 'default_sharing_status' is not in camel case camelcase + 37:3 error Identifier 'featured_images_enabled' is not in camel case camelcase + 38:3 error Identifier 'gmt_offset' is not in camel case camelcase + 39:3 error Identifier 'header_image' is not in camel case camelcase + 40:3 error Identifier 'image_default_link_type' is not in camel case camelcase + 41:3 error Identifier 'image_large_height' is not in camel case camelcase + 42:3 error Identifier 'image_large_width' is not in camel case camelcase + 43:3 error Identifier 'image_medium_height' is not in camel case camelcase + 44:3 error Identifier 'image_medium_width' is not in camel case camelcase + 45:3 error Identifier 'image_thumbnail_crop' is not in camel case camelcase + 46:3 error Identifier 'image_thumbnail_height' is not in camel case camelcase + 47:3 error Identifier 'image_thumbnail_width' is not in camel case camelcase + 48:3 error Identifier 'is_mapped_domain' is not in camel case camelcase + 49:3 error Identifier 'is_multi_network' is not in camel case camelcase + 50:3 error Identifier 'is_multi_site' is not in camel case camelcase + 51:3 error Identifier 'is_redirect' is not in camel case camelcase + 52:3 error Identifier 'jetpack_version' is not in camel case camelcase + 53:3 error Identifier 'login_url' is not in camel case camelcase + 54:3 error Identifier 'main_network_site' is not in camel case camelcase + 55:3 error Identifier 'permalink_structure' is not in camel case camelcase + 56:3 error Identifier 'post_formats' is not in camel case camelcase + 57:3 error Identifier 'show_on_front' is not in camel case camelcase + 58:3 error Identifier 'software_version' is not in camel case camelcase + 59:3 error Identifier 'theme_slug' is not in camel case camelcase + 61:3 error Identifier 'unmapped_url' is not in camel case camelcase + 62:3 error Identifier 'upgraded_filetypes_enabled' is not in camel case camelcase + 63:3 error Identifier 'videopress_enabled' is not in camel case camelcase + 67:2 error Identifier 'post_count' is not in camel case camelcase + 68:2 error Identifier 'single_user_site' is not in camel case camelcase + 70:2 error Identifier 'subscribers_count' is not in camel case camelcase + 73:2 error Identifier 'jp_version' is not in camel case camelcase + 74:2 error Identifier 'user_can_manage' is not in camel case camelcase + 76:2 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/plugins/test/fixtures/plugins-updated.js + 6:3 error Identifier 'author_url' is not in camel case camelcase + 9:1 error Line 9 exceeds the maximum line length of 100 max-len + 13:3 error Identifier 'plugin_url' is not in camel case camelcase + 17:4 error Identifier 'new_version' is not in camel case camelcase + 18:4 error Unquoted reserved word 'package' used as key quote-props + 28:3 error Identifier 'author_url' is not in camel case camelcase + 34:3 error Identifier 'plugin_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/plugins/test/fixtures/plugins.js + 6:3 error Identifier 'author_url' is not in camel case camelcase + 9:1 error Line 9 exceeds the maximum line length of 100 max-len + 13:3 error Identifier 'plugin_url' is not in camel case camelcase + 20:3 error Identifier 'author_url' is not in camel case camelcase + 26:3 error Identifier 'plugin_url' is not in camel case camelcase + 33:3 error Identifier 'author_url' is not in camel case camelcase + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 40:3 error Identifier 'plugin_url' is not in camel case camelcase + 44:4 error Identifier 'new_version' is not in camel case camelcase + 45:4 error Unquoted reserved word 'package' used as key quote-props + 55:3 error Identifier 'author_url' is not in camel case camelcase + 61:3 error Identifier 'plugin_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/plugins/test/fixtures/site.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:3 error Identifier 'manage_options' is not in camel case camelcase + 21:2 error Identifier 'is_following' is not in camel case camelcase + 22:2 error Identifier 'is_private' is not in camel case camelcase + 29:3 error Identifier 'jetpack_version' is not in camel case camelcase + 30:3 error Identifier 'is_multi_site' is not in camel case camelcase + 34:2 error Identifier 'post_count' is not in camel case camelcase + 35:2 error Identifier 'single_user_site' is not in camel case camelcase + 37:2 error Identifier 'subscribers_count' is not in camel case camelcase + 40:2 error Identifier 'jp_version' is not in camel case camelcase + 41:2 error Identifier 'user_can_manage' is not in camel case camelcase + 43:2 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/plugins/test/fixtures/updated-plugin.js + 5:2 error Identifier 'author_url' is not in camel case camelcase + 11:2 error Identifier 'plugin_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/plugins/test/mocks/wpcom.js + 2:1 error Unexpected var, use let or const instead no-var + 16:3 error Unquoted reserved word 'delete' used as key quote-props + 42:3 error Unquoted reserved word 'delete' used as key quote-props + +/Users/seear/repos/wp-calypso/client/lib/plugins/test/store.js + 152:15 error Identifier 'product_slug' is not in camel case camelcase + 182:13 error Identifier 'product_slug' is not in camel case camelcase + 194:1 error Line 194 exceeds the maximum line length of 100 max-len + 253:1 error Line 253 exceeds the maximum line length of 100 max-len + 342:1 error Line 342 exceeds the maximum line length of 100 max-len + 379:1 error Line 379 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/plugins/test/utils.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 61:5 error Identifier 'author_url' is not in camel case camelcase + 67:5 error Identifier 'plugin_url' is not in camel case camelcase + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + 114:1 error Line 114 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 118:1 error Line 118 exceeds the maximum line length of 100 max-len + 124:1 error Line 124 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/plugins/utils.js + 14:1 error 'lib/formatting' import is duplicated no-duplicate-imports + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + 201:17 error Identifier 'author_name' is not in camel case camelcase + 202:1 error Line 202 exceeds the maximum line length of 100 max-len + 202:17 error Identifier 'author_url' is not in camel case camelcase + 207:1 error Line 207 exceeds the maximum line length of 100 max-len + 231:17 error Identifier 'plugin_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/plugins/wporg-data/actions.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/plugins/wporg-data/list-store.js + 16:1 error Unexpected var, use let or const instead no-var + 58:3 error Unexpected var, use let or const instead no-var + 82:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/plugins/wporg-data/test/actions.js + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/plugins/wporg-data/test/fixtures/actions.js + 2:1 error Unexpected var, use let or const instead no-var + 8:3 error Identifier 'author_profile' is not in camel case camelcase + 11:3 error Identifier 'num_ratings' is not in camel case camelcase + 20:3 error Identifier 'short_description' is not in camel case camelcase + 22:12 error Unquoted reserved word 'default' used as key quote-props + +/Users/seear/repos/wp-calypso/client/lib/plugins/wporg-data/test/list-store.js + 96:4 error 'newPlugins' is never reassigned. Use 'const' instead prefer-const + 119:1 error Line 119 exceeds the maximum line length of 100 max-len + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + 133:1 error Line 133 exceeds the maximum line length of 100 max-len + 151:4 error 'searchPlugins' is never reassigned. Use 'const' instead prefer-const + 175:1 error Line 175 exceeds the maximum line length of 100 max-len + 183:1 error Line 183 exceeds the maximum line length of 100 max-len + 190:1 error Line 190 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/plugins/wporg-data/test/mocks/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/popup-monitor/index.js + 27:1 error JSDoc syntax error valid-jsdoc + 38:2 error Unexpected var, use let or const instead no-var + 57:2 error Unexpected var, use let or const instead no-var + 68:1 error JSDoc syntax error valid-jsdoc + 76:2 error Unexpected var, use let or const instead no-var + 91:8 error Unexpected var, use let or const instead no-var + 104:1 error JSDoc syntax error valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/popup-monitor/test/index.js + 17:2 error Unexpected var, use let or const instead no-var + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 34:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/post-metadata/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 12:1 error Unexpected var, use let or const instead no-var + 17:2 error Unexpected var, use let or const instead no-var + 126:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/post-metadata/test/index.js + 17:4 error Unexpected var, use let or const instead no-var + 23:4 error Unexpected var, use let or const instead no-var + 29:4 error Unexpected var, use let or const instead no-var + 35:4 error Unexpected var, use let or const instead no-var + 48:4 error Unexpected var, use let or const instead no-var + 54:4 error Unexpected var, use let or const instead no-var + 61:4 error Unexpected var, use let or const instead no-var + 68:4 error Unexpected var, use let or const instead no-var + 79:4 error Unexpected var, use let or const instead no-var + 92:4 error Unexpected var, use let or const instead no-var + 98:4 error Unexpected var, use let or const instead no-var + 105:4 error Unexpected var, use let or const instead no-var + 112:4 error Unexpected var, use let or const instead no-var + 123:4 error Unexpected var, use let or const instead no-var + 136:4 error Unexpected var, use let or const instead no-var + 142:4 error Unexpected var, use let or const instead no-var + 148:4 error Unexpected var, use let or const instead no-var + 154:4 error Unexpected var, use let or const instead no-var + 167:4 error Unexpected var, use let or const instead no-var + 173:4 error Unexpected var, use let or const instead no-var + 179:4 error Unexpected var, use let or const instead no-var + 184:1 error Line 184 exceeds the maximum line length of 100 max-len + 185:4 error Unexpected var, use let or const instead no-var + 193:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/index.js + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 36:6 error 'normalizedPost' is never reassigned. Use 'const' instead prefer-const + 37:3 error 'postDebug' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-add-discover-properties.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 30:7 error Identifier 'is_discover' is not in camel case camelcase + 31:7 error Identifier 'discover_format' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-content-detect-media.js + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 148:7 error Identifier 'content_media' is not in camel case camelcase + 149:7 error Identifier 'content_embeds' is not in camel case camelcase + 150:7 error Identifier 'content_images' is not in camel case camelcase + 155:8 error Identifier 'featured_image' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-content-detect-polls.js + 22:6 error 'noscripts' is never reassigned. Use 'const' instead prefer-const + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 32:7 error 'pollLink' is never reassigned. Use 'const' instead prefer-const + 36:9 error 'p' is never reassigned. Use 'const' instead prefer-const + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-content-link-jetpack-carousels.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 12:1 error Line 12 exceeds the maximum line length of 100 max-len + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-content-make-images-safe.js + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-content-remove-styles.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-create-better-excerpt.js + 15:1 error Missing JSDoc for parameter 'element' valid-jsdoc + 22:1 error Missing JSDoc for parameter 'dom' valid-jsdoc + 37:1 error Missing JSDoc @returns for function valid-jsdoc + 37:1 error Missing JSDoc for parameter 'dom' valid-jsdoc + 104:7 error Identifier 'content_no_html' is not in camel case camelcase + 106:7 error Identifier 'better_excerpt' is not in camel case camelcase + 107:7 error Identifier 'better_excerpt_no_html' is not in camel case camelcase + 118:8 error Identifier 'short_excerpt' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-decode-entities.js + 34:16 error Identifier 'avatar_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-keep-valid-images.js + 26:9 error Identifier 'content_images' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-make-links-safe.js + 16:8 error Identifier 'short_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-make-site-id-safe-for-api.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'post' valid-jsdoc + 4:8 error Identifier 'normalized_site_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-pick-canonical-image.js + 34:8 error Identifier 'canonical_image' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-pick-canonical-media.js + 43:1 error Missing JSDoc @returns for function valid-jsdoc + 43:1 error Missing JSDoc for parameter 'post' valid-jsdoc + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 60:8 error Identifier 'canonical_media' is not in camel case camelcase + 72:8 error Identifier 'canonical_media' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-pick-primary-tag.js + 15:8 error Identifier 'primary_tag' is not in camel case camelcase + 19:7 error Identifier 'primary_tag' is not in camel case camelcase + 20:8 error Identifier 'primary_tag' is not in camel case camelcase + 20:22 error Identifier 'primary_tag' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/rule-wait-for-images-to-load.js + 50:11 error Identifier 'featured_image' is not in camel case camelcase + 56:9 error Identifier 'content_images' is not in camel case camelcase + 64:9 error Identifier 'content_media' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/test/index.js + 198:6 error Identifier 'site_id' is not in camel case camelcase + 211:6 error Identifier 'site_id' is not in camel case camelcase + 227:6 error Identifier 'avatar_URL' is not in camel case camelcase + 229:5 error Identifier 'featured_image' is not in camel case camelcase + 230:5 error Identifier 'featured_media' is not in camel case camelcase + 234:5 error Identifier 'post_thumbnail' is not in camel case camelcase + 238:6 error Identifier 'mime_type' is not in camel case camelcase + 242:7 error Identifier 'mime_type' is not in camel case camelcase + 246:7 error Identifier 'mime_type' is not in camel case camelcase + 251:1 error Line 251 exceeds the maximum line length of 100 max-len + 272:1 error Line 272 exceeds the maximum line length of 100 max-len + 279:5 error Identifier 'featured_media' is not in camel case camelcase + 283:1 error Line 283 exceeds the maximum line length of 100 max-len + 291:1 error Line 291 exceeds the maximum line length of 100 max-len + 296:7 error Identifier 'post_count' is not in camel case camelcase + 300:7 error Identifier 'post_count' is not in camel case camelcase + 311:1 error Line 311 exceeds the maximum line length of 100 max-len + 316:7 error Identifier 'post_count' is not in camel case camelcase + 320:7 error Identifier 'post_count' is not in camel case camelcase + 415:1 error Line 415 exceeds the maximum line length of 100 max-len + 432:1 error Line 432 exceeds the maximum line length of 100 max-len + 452:1 error Line 452 exceeds the maximum line length of 100 max-len + 521:1 error Line 521 exceeds the maximum line length of 100 max-len + 527:1 error Line 527 exceeds the maximum line length of 100 max-len + 573:1 error Line 573 exceeds the maximum line length of 100 max-len + 579:1 error Line 579 exceeds the maximum line length of 100 max-len + 580:1 error Line 580 exceeds the maximum line length of 100 max-len + 591:1 error Line 591 exceeds the maximum line length of 100 max-len + 606:1 error Line 606 exceeds the maximum line length of 100 max-len + 623:1 error Line 623 exceeds the maximum line length of 100 max-len + 627:1 error Line 627 exceeds the maximum line length of 100 max-len + 641:1 error Line 641 exceeds the maximum line length of 100 max-len + 655:1 error Line 655 exceeds the maximum line length of 100 max-len + 663:3 warning Skipped test jest/no-disabled-tests + 688:5 error Identifier 'content_images' is not in camel case camelcase + 697:3 warning Skipped test jest/no-disabled-tests + 711:6 error Identifier 'content_images' is not in camel case camelcase + 724:5 error Identifier 'content_images' is not in camel case camelcase + 750:1 error Line 750 exceeds the maximum line length of 100 max-len + 755:1 error Line 755 exceeds the maximum line length of 100 max-len + 763:6 error Identifier 'post_thumbnail' is not in camel case camelcase + 771:1 error Line 771 exceeds the maximum line length of 100 max-len + 777:1 error Line 777 exceeds the maximum line length of 100 max-len + 780:6 error Identifier 'featured_image' is not in camel case camelcase + 781:6 error Identifier 'post_thumbnail' is not in camel case camelcase + 785:7 error Identifier 'mime_type' is not in camel case camelcase + 787:6 error Identifier 'featured_media' is not in camel case camelcase + 794:1 error Line 794 exceeds the maximum line length of 100 max-len + 811:6 error Identifier 'content_images' is not in camel case camelcase + 853:1 error Line 853 exceeds the maximum line length of 100 max-len + 868:1 error Line 868 exceeds the maximum line length of 100 max-len + 891:6 error Identifier 'is_external' is not in camel case camelcase + 893:1 error Line 893 exceeds the maximum line length of 100 max-len + 906:6 error Identifier 'is_external' is not in camel case camelcase + 907:1 error Line 907 exceeds the maximum line length of 100 max-len + 947:1 error Line 947 exceeds the maximum line length of 100 max-len + 983:1 error Line 983 exceeds the maximum line length of 100 max-len + 1017:1 error Line 1017 exceeds the maximum line length of 100 max-len + 1059:1 error Line 1059 exceeds the maximum line length of 100 max-len + 1080:1 error Line 1080 exceeds the maximum line length of 100 max-len + 1082:1 error Line 1082 exceeds the maximum line length of 100 max-len + 1083:1 error Line 1083 exceeds the maximum line length of 100 max-len + 1141:1 error Line 1141 exceeds the maximum line length of 100 max-len + 1208:1 error Line 1208 exceeds the maximum line length of 100 max-len + 1224:1 error Line 1224 exceeds the maximum line length of 100 max-len + 1229:1 error Line 1229 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/test/utils.js + 16:4 error Identifier 'post_thumbnail' is not in camel case camelcase + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 26:4 error Identifier 'post_thumbnail' is not in camel case camelcase + 36:4 error Identifier 'post_thumbnail' is not in camel case camelcase + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 46:4 error Identifier 'post_thumbnail' is not in camel case camelcase + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 56:4 error Identifier 'post_thumbnail' is not in camel case camelcase + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/post-normalizer/utils.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 113:1 error Line 113 exceeds the maximum line length of 100 max-len + 142:1 error Line 142 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/posts/actions.js + 19:1 error 'lib/sites-list' import is restricted from being used no-restricted-imports + 29:1 error Unexpected var, use let or const instead no-var + 45:2 error Unexpected var, use let or const instead no-var + 63:3 error Unexpected var, use let or const instead no-var + 107:3 error Unexpected var, use let or const instead no-var + 128:3 error Unexpected var, use let or const instead no-var + 166:3 error Unexpected var, use let or const instead no-var + 300:1 error Line 300 exceeds the maximum line length of 100 max-len + 303:3 error Unexpected var, use let or const instead no-var + 359:1 error Line 359 exceeds the maximum line length of 100 max-len + 361:1 error Line 361 exceeds the maximum line length of 100 max-len + 365:1 error Line 365 exceeds the maximum line length of 100 max-len + 366:1 error Line 366 exceeds the maximum line length of 100 max-len + 374:4 error Unexpected var, use let or const instead no-var + 386:1 error Line 386 exceeds the maximum line length of 100 max-len + 406:3 error Unexpected var, use let or const instead no-var + 419:3 error Unexpected var, use let or const instead no-var + 431:3 error Unexpected var, use let or const instead no-var + 444:2 error Missing JSDoc for parameter 'postListStoreId' valid-jsdoc + 470:1 error Line 470 exceeds the maximum line length of 100 max-len + 511:1 error Line 511 exceeds the maximum line length of 100 max-len + 512:1 error Line 512 exceeds the maximum line length of 100 max-len + 527:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/posts/post-edit-store.js + 21:1 error Unexpected var, use let or const instead no-var + 24:1 error Unexpected var, use let or const instead no-var + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 103:2 error Unexpected var, use let or const instead no-var + 107:3 error Identifier 'site_ID' is not in camel case camelcase + 125:2 error Unexpected var, use let or const instead no-var + 141:1 error Line 141 exceeds the maximum line length of 100 max-len + 161:7 error Identifier 'parent_id' is not in camel case camelcase + 163:8 error Identifier 'page_template' is not in camel case camelcase + 169:2 error Unexpected var, use let or const instead no-var + 198:2 error Unexpected var, use let or const instead no-var + 297:16 error Identifier 'preview_URL' is not in camel case camelcase + 327:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/posts/post-list-cache-store.js + 13:1 error 'lib/sites-list' import is restricted from being used no-restricted-imports + 119:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/posts/post-list-store-factory.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/posts/post-list-store.js + 90:7 error 'query' is never reassigned. Use 'const' instead prefer-const + 97:7 error 'list' is never reassigned. Use 'const' instead prefer-const + 146:4 error Unexpected var, use let or const instead no-var + 246:3 error 'posts' is never reassigned. Use 'const' instead prefer-const + 250:3 error 'postIds' is never reassigned. Use 'const' instead prefer-const + 254:3 error 'newPostIds' is never reassigned. Use 'const' instead prefer-const + 293:9 error 'post' is never reassigned. Use 'const' instead prefer-const + 334:8 error 'params' is never reassigned. Use 'const' instead prefer-const + 338:11 error Identifier 'order_by' is not in camel case camelcase + 343:11 error Identifier 'page_handle' is not in camel case camelcase + 344:11 error Identifier 'exclude_tree' is not in camel case camelcase + 344:32 error Identifier 'exclude_tree' is not in camel case camelcase + 363:12 error Identifier 'site_visibility' is not in camel case camelcase + 374:8 error 'params' is never reassigned. Use 'const' instead prefer-const + 395:12 error Identifier 'site_visibility' is not in camel case camelcase + 403:12 error Identifier 'modified_after' is not in camel case camelcase + 421:1 error Line 421 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/posts/posts-store.js + 17:1 error Unexpected var, use let or const instead no-var + 21:2 error Unexpected var, use let or const instead no-var + 31:10 error Identifier 'global_ID' is not in camel case camelcase + 32:9 error Identifier 'global_ID' is not in camel case camelcase + 61:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/posts/stats.js + 8:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 18:1 error 'lib/sites-list' import is restricted from being used no-restricted-imports + 112:3 error Identifier 'post_id' is not in camel case camelcase + 113:3 error Identifier 'post_type' is not in camel case camelcase + 115:3 error Identifier 'current_status' is not in camel case camelcase + 116:3 error Identifier 'next_status' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/posts/test/actions.js + 154:1 error Line 154 exceeds the maximum line length of 100 max-len + 167:1 error Line 167 exceeds the maximum line length of 100 max-len + 211:5 error Identifier 'site_ID' is not in camel case camelcase + 230:6 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/posts/test/post-edit-store.js + 39:6 error Identifier 'site_ID' is not in camel case camelcase + 437:6 error Identifier 'site_ID' is not in camel case camelcase + 440:6 error Identifier 'parent_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/posts/test/post-list-store.js + 28:4 error Identifier 'global_ID' is not in camel case camelcase + 31:4 error Identifier 'global_ID' is not in camel case camelcase + 39:4 error Identifier 'global_ID' is not in camel case camelcase + 42:4 error Identifier 'global_ID' is not in camel case camelcase + 45:4 error Identifier 'global_ID' is not in camel case camelcase + 53:4 error Identifier 'global_ID' is not in camel case camelcase + 56:4 error Identifier 'global_ID' is not in camel case camelcase + 68:4 error Identifier 'global_ID' is not in camel case camelcase + 71:4 error Identifier 'global_ID' is not in camel case camelcase + 74:4 error Identifier 'global_ID' is not in camel case camelcase + 86:4 error Identifier 'global_ID' is not in camel case camelcase + 89:4 error Identifier 'global_ID' is not in camel case camelcase + 100:5 error Identifier 'global_ID' is not in camel case camelcase + 196:1 error Line 196 exceeds the maximum line length of 100 max-len + 224:1 error Line 224 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/posts/test/utils.js + 166:5 error Identifier 'other_URLs' is not in camel case camelcase + 166:19 error Identifier 'permalink_URL' is not in camel case camelcase + 189:5 error Identifier 'other_URLs' is not in camel case camelcase + 189:19 error Identifier 'permalink_URL' is not in camel case camelcase + 202:5 error Identifier 'featured_image' is not in camel case camelcase + 203:5 error Identifier 'post_thumbnail' is not in camel case camelcase + 215:5 error Identifier 'featured_image' is not in camel case camelcase + 216:5 error Identifier 'post_thumbnail' is not in camel case camelcase + 224:1 error Line 224 exceeds the maximum line length of 100 max-len + 226:5 error Identifier 'featured_image' is not in camel case camelcase + 227:5 error Identifier 'post_thumbnail' is not in camel case camelcase + 235:1 error Line 235 exceeds the maximum line length of 100 max-len + 237:5 error Identifier 'featured_image' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/posts/utils-ssr-ready.js + 2:1 error Line 2 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/posts/utils.js + 22:1 error Unexpected var, use let or const instead no-var + 36:3 error Unexpected var, use let or const instead no-var + 74:3 error Unexpected var, use let or const instead no-var + 147:3 error Unexpected var, use let or const instead no-var + 216:7 error 'pathParts' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/preferences/actions.js + 30:2 error Unexpected var, use let or const instead no-var + 44:2 error Unexpected var, use let or const instead no-var + 80:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/preferences/store.js + 19:1 error Unexpected var, use let or const instead no-var + 71:2 error Unexpected var, use let or const instead no-var + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/preferences/test/actions.js + 30:8 error 'getSettings' is already declared in the upper scope no-shadow + 31:8 error 'postSettings' is already declared in the upper scope no-shadow + +/Users/seear/repos/wp-calypso/client/lib/products-list/index.js + 18:1 error Missing JSDoc @returns for function valid-jsdoc + 36:1 error Missing JSDoc return description valid-jsdoc + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 43:2 error Unexpected var, use let or const instead no-var + 74:4 error Unexpected var, use let or const instead no-var + 101:1 error Missing JSDoc for parameter 'productsList' valid-jsdoc + 109:1 error Missing JSDoc return description valid-jsdoc + 118:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/products-values/index.js + 36:3 error Identifier 'domain_redemption' is not in camel case camelcase + 38:3 error Identifier 'gapps_extra_license' is not in camel case camelcase + 39:3 error Identifier 'gapps_unlimited' is not in camel case camelcase + 40:3 error Identifier 'private_whois' is not in camel case camelcase + 42:2 error Identifier 'domain_redemption' is not in camel case camelcase + 59:3 error Identifier 'product_slug' is not in camel case camelcase + 60:3 error Identifier 'product_type' is not in camel case camelcase + 61:3 error Identifier 'is_domain_registration' is not in camel case camelcase + 65:3 error Identifier 'free_trial' is not in camel case camelcase + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 123:1 error Line 123 exceeds the maximum line length of 100 max-len + 213:1 error Line 213 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/products-values/sort.js + 32:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/products-values/test/index.js + 26:29 error Identifier 'product_slug' is not in camel case camelcase + 26:49 error Identifier 'product_slug' is not in camel case camelcase + 26:49 error Identifier 'product_slug' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/purchases/assembler.js + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/purchases/test/assembler.js + 30:5 error Identifier 'payment_card_id' is not in camel case camelcase + 31:5 error Identifier 'payment_card_type' is not in camel case camelcase + 32:5 error Identifier 'payment_details' is not in camel case camelcase + 33:5 error Identifier 'payment_expiry' is not in camel case camelcase + 34:5 error Identifier 'payment_type' is not in camel case camelcase + 35:5 error Identifier 'payment_name' is not in camel case camelcase + 36:5 error Identifier 'payment_country_code' is not in camel case camelcase + 37:5 error Identifier 'payment_country_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/query-manager/index.js + 112:1 error Line 112 exceeds the maximum line length of 100 max-len + 369:1 error Line 369 exceeds the maximum line length of 100 max-len + 388:1 error Line 388 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/query-manager/media/constants.js + 4:2 error Identifier 'http_envelope' is not in camel case camelcase + 10:2 error Identifier 'order_by' is not in camel case camelcase + 11:2 error Identifier 'mime_type' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/query-manager/media/index.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/query-manager/media/test/index.js + 20:2 error Identifier 'post_ID' is not in camel case camelcase + 21:2 error Identifier 'author_ID' is not in camel case camelcase + 23:2 error Identifier 'mime_type' is not in camel case camelcase + 90:7 error Identifier 'mime_type' is not in camel case camelcase + 101:7 error Identifier 'mime_type' is not in camel case camelcase + 112:7 error Identifier 'mime_type' is not in camel case camelcase + 123:7 error Identifier 'mime_type' is not in camel case camelcase + 134:7 error Identifier 'mime_type' is not in camel case camelcase + 145:7 error Identifier 'mime_type' is not in camel case camelcase + 156:7 error Identifier 'mime_type' is not in camel case camelcase + 167:7 error Identifier 'mime_type' is not in camel case camelcase + 178:7 error Identifier 'mime_type' is not in camel case camelcase + 189:7 error Identifier 'mime_type' is not in camel case camelcase + 200:7 error Identifier 'mime_type' is not in camel case camelcase + 213:7 error Identifier 'post_ID' is not in camel case camelcase + 224:7 error Identifier 'post_ID' is not in camel case camelcase + 309:7 error Identifier 'order_by' is not in camel case camelcase + 319:7 error Identifier 'order_by' is not in camel case camelcase + 363:8 error Identifier 'order_by' is not in camel case camelcase + 375:8 error Identifier 'order_by' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/query-manager/paginated/test/index.js + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 138:1 error Line 138 exceeds the maximum line length of 100 max-len + 173:1 error Line 173 exceeds the maximum line length of 100 max-len + 182:1 error Line 182 exceeds the maximum line length of 100 max-len + 192:1 error Line 192 exceeds the maximum line length of 100 max-len + 222:1 error Line 222 exceeds the maximum line length of 100 max-len + 223:1 error Line 223 exceeds the maximum line length of 100 max-len + 224:1 error Line 224 exceeds the maximum line length of 100 max-len + 225:1 error Line 225 exceeds the maximum line length of 100 max-len + 239:1 error Line 239 exceeds the maximum line length of 100 max-len + 317:1 error Line 317 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/query-manager/post/constants.js + 4:2 error Identifier 'http_envelope' is not in camel case camelcase + 10:2 error Identifier 'order_by' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/query-manager/post/index.js + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 136:1 error Line 136 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/query-manager/post/key.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/query-manager/post/test/index.js + 17:2 error Identifier 'site_ID' is not in camel case camelcase + 31:3 error Identifier 'comments_open' is not in camel case camelcase + 32:3 error Identifier 'comment_status' is not in camel case camelcase + 33:3 error Identifier 'pings_open' is not in camel case camelcase + 34:3 error Identifier 'ping_status' is not in camel case camelcase + 35:3 error Identifier 'comment_count' is not in camel case camelcase + 52:3 error Identifier 'post_tag' is not in camel case camelcase + 234:7 error Identifier 'modified_after' is not in camel case camelcase + 245:7 error Identifier 'modified_after' is not in camel case camelcase + 256:7 error Identifier 'modified_after' is not in camel case camelcase + 269:7 error Identifier 'modified_before' is not in camel case camelcase + 280:7 error Identifier 'modified_before' is not in camel case camelcase + 291:7 error Identifier 'modified_before' is not in camel case camelcase + 524:7 error Identifier 'parent_id' is not in camel case camelcase + 538:7 error Identifier 'parent_id' is not in camel case camelcase + 554:7 error Identifier 'parent_id' is not in camel case camelcase + 805:7 error Identifier 'order_by' is not in camel case camelcase + 815:7 error Identifier 'order_by' is not in camel case camelcase + 855:8 error Identifier 'order_by' is not in camel case camelcase + 876:8 error Identifier 'order_by' is not in camel case camelcase + 887:7 error Identifier 'comment_count' is not in camel case camelcase + 894:7 error Identifier 'comment_count' is not in camel case camelcase + 901:8 error Identifier 'order_by' is not in camel case camelcase + 913:8 error Identifier 'order_by' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/query-manager/term/constants.js + 4:2 error Identifier 'http_envelope' is not in camel case camelcase + 11:2 error Identifier 'order_by' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/query-manager/term/key.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/query-manager/term/test/index.js + 20:2 error Identifier 'post_count' is not in camel case camelcase + 90:7 error Identifier 'order_by' is not in camel case camelcase + 100:7 error Identifier 'order_by' is not in camel case camelcase + 114:8 error Identifier 'order_by' is not in camel case camelcase + 125:6 error Identifier 'post_count' is not in camel case camelcase + 131:8 error Identifier 'order_by' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/query-manager/test/index.js + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 238:1 error Line 238 exceeds the maximum line length of 100 max-len + 245:1 error Line 245 exceeds the maximum line length of 100 max-len + 252:1 error Line 252 exceeds the maximum line length of 100 max-len + 259:1 error Line 259 exceeds the maximum line length of 100 max-len + 266:1 error Line 266 exceeds the maximum line length of 100 max-len + 282:1 error Line 282 exceeds the maximum line length of 100 max-len + 326:1 error Line 326 exceeds the maximum line length of 100 max-len + 403:1 error Line 403 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/query-manager/test/key.js + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/react-pass-to-children/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/react-pass-to-children/test/index.js + 19:1 error Unexpected var, use let or const instead no-var + 29:2 error Unexpected var, use let or const instead no-var + 36:3 error Unexpected var, use let or const instead no-var + 50:3 error Unexpected var, use let or const instead no-var + 66:3 error Unexpected var, use let or const instead no-var + 87:3 error Unexpected var, use let or const instead no-var + 102:3 error Unexpected var, use let or const instead no-var + 120:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/react-smart-set-state/index.js + 12:1 error Line 12 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/reader-connect-site/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/reader-lists/actions.js + 3:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:1 error Unexpected var, use let or const instead no-var + 33:3 error Unexpected var, use let or const instead no-var + 67:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/reader-lists/lists.js + 3:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:1 error Unexpected var, use let or const instead no-var + 67:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/reader-lists/subscriptions.js + 16:1 error Unexpected var, use let or const instead no-var + 30:3 error Unexpected var, use let or const instead no-var + 76:3 error Unexpected var, use let or const instead no-var + 104:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/reader-post-flux-adapter/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 20:1 error Missing JSDoc @returns for function valid-jsdoc + 20:1 error Missing JSDoc for parameter 'Component' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/rebrand-cities/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/resize-image-url/test/index.js + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/restore-last-path/index.js + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/route/add-query-args.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/route/normalize.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/route/page-notifier.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:1 error Unexpected var, use let or const instead no-var + 14:1 error Unexpected var, use let or const instead no-var + 15:1 error Unexpected var, use let or const instead no-var + 16:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/route/redirect.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/route/test/index.js + 143:1 error Line 143 exceeds the maximum line length of 100 max-len + 146:1 error Line 146 exceeds the maximum line length of 100 max-len + 155:1 error Line 155 exceeds the maximum line length of 100 max-len + 191:1 error Line 191 exceeds the maximum line length of 100 max-len + 221:1 error Line 221 exceeds the maximum line length of 100 max-len + 231:1 error Line 231 exceeds the maximum line length of 100 max-len + 249:1 error Line 249 exceeds the maximum line length of 100 max-len + 251:1 error Line 251 exceeds the maximum line length of 100 max-len + 253:1 error Line 253 exceeds the maximum line length of 100 max-len + 261:1 error Line 261 exceeds the maximum line length of 100 max-len + 263:1 error Line 263 exceeds the maximum line length of 100 max-len + 265:1 error Line 265 exceeds the maximum line length of 100 max-len + 278:1 error Line 278 exceeds the maximum line length of 100 max-len + 294:1 error Line 294 exceeds the maximum line length of 100 max-len + 302:1 error Line 302 exceeds the maximum line length of 100 max-len + 321:1 error Line 321 exceeds the maximum line length of 100 max-len + 335:1 error Line 335 exceeds the maximum line length of 100 max-len + 354:1 error Line 354 exceeds the maximum line length of 100 max-len + 371:1 error Line 371 exceeds the maximum line length of 100 max-len + 377:1 error Line 377 exceeds the maximum line length of 100 max-len + 381:1 error Line 381 exceeds the maximum line length of 100 max-len + 387:1 error Line 387 exceeds the maximum line length of 100 max-len + 391:1 error Line 391 exceeds the maximum line length of 100 max-len + 399:1 error Line 399 exceeds the maximum line length of 100 max-len + 405:1 error Line 405 exceeds the maximum line length of 100 max-len + 447:1 error Line 447 exceeds the maximum line length of 100 max-len + 478:1 error Line 478 exceeds the maximum line length of 100 max-len + 493:1 error Line 493 exceeds the maximum line length of 100 max-len + 524:1 error Line 524 exceeds the maximum line length of 100 max-len + 552:1 error Line 552 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/route/trailingslashit.js + 2:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/route/untrailingslashit.js + 2:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/safe-image-url/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/safe-image-url/test/index.js + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/safe-protocol-url/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/safe-protocol-url/test/index.js + 20:3 error Unexpected var, use let or const instead no-var + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/scroll-into-viewport/index.js + 2:1 error Line 2 exceeds the maximum line length of 100 max-len + 18:1 error Missing JSDoc parameter description for 'elementStart' valid-jsdoc + 18:1 error Missing JSDoc parameter description for 'elementEnd' valid-jsdoc + 18:1 error Missing JSDoc return description valid-jsdoc + 25:2 error Unexpected var, use let or const instead no-var + 30:1 error Missing JSDoc parameter description for 'element' valid-jsdoc + 35:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/scroll-to/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/service-worker/service-worker.js + 16:1 error Unexpected var, use let or const instead no-var + 33:2 error Unexpected var, use let or const instead no-var + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 60:2 error Unexpected var, use let or const instead no-var + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 90:5 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/sharing/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/shortcode/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 12:1 error Unexpected var, use let or const instead no-var + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + 29:2 error Unexpected var, use let or const instead no-var + 67:2 error Unexpected var, use let or const instead no-var + 95:2 error Unexpected var, use let or const instead no-var + 99:3 error Unexpected var, use let or const instead no-var + 137:2 error Unexpected var, use let or const instead no-var + 192:1 error Line 192 exceeds the maximum line length of 100 max-len + 213:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/shortcode/test/index.js + 16:4 error Unexpected var, use let or const instead no-var + 27:4 error Unexpected var, use let or const instead no-var + 36:4 error Unexpected var, use let or const instead no-var + 49:4 error Unexpected var, use let or const instead no-var + 60:4 error Unexpected var, use let or const instead no-var + 69:4 error Unexpected var, use let or const instead no-var + 80:4 error Unexpected var, use let or const instead no-var + 89:4 error Unexpected var, use let or const instead no-var + 99:4 error Unexpected var, use let or const instead no-var + 111:4 error Unexpected var, use let or const instead no-var + 119:4 error Unexpected var, use let or const instead no-var + 130:4 error Unexpected var, use let or const instead no-var + 139:4 error Unexpected var, use let or const instead no-var + 151:4 error Unexpected var, use let or const instead no-var + 160:4 error Unexpected var, use let or const instead no-var + 169:4 error Unexpected var, use let or const instead no-var + 180:4 error Unexpected var, use let or const instead no-var + 189:4 error Unexpected var, use let or const instead no-var + 204:4 error Unexpected var, use let or const instead no-var + 217:4 error Unexpected var, use let or const instead no-var + 232:4 error Unexpected var, use let or const instead no-var + 241:4 error Unexpected var, use let or const instead no-var + 250:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/shortcodes/store.js + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/siftscience/index.js + 18:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/signup/actions.js + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/signup/cart.js + 33:4 error Identifier 'cart_key' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/signup/dependency-store.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/signup/flow-controller.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 156:5 error Unexpected var, use let or const instead no-var + 201:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/signup/progress-store.js + 30:1 error Unexpected var, use let or const instead no-var + 154:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/signup/step-actions.js + 12:1 error 'lodash' import is duplicated no-duplicate-imports + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + 119:3 error Identifier 'blog_name' is not in camel case camelcase + 120:3 error Identifier 'blog_title' is not in camel case camelcase + 130:3 error Identifier 'find_available_url' is not in camel case camelcase + 282:1 error Line 282 exceeds the maximum line length of 100 max-len + 288:1 error Line 288 exceeds the maximum line length of 100 max-len + 338:45 error Identifier 'access_token' is not in camel case camelcase + 338:59 error Identifier 'id_token' is not in camel case camelcase + 348:5 error Identifier 'access_token' is not in camel case camelcase + 348:5 error Identifier 'access_token' is not in camel case camelcase + 349:5 error Identifier 'id_token' is not in camel case camelcase + 349:5 error Identifier 'id_token' is not in camel case camelcase + 350:5 error Identifier 'signup_flow_name' is not in camel case camelcase + 354:1 error Line 354 exceeds the maximum line length of 100 max-len + 368:6 error Identifier 'ab_test_variations' is not in camel case camelcase + 370:6 error Identifier 'signup_flow_name' is not in camel case camelcase + 371:6 error Identifier 'nux_q_site_type' is not in camel case camelcase + 372:6 error Identifier 'nux_q_question_primary' is not in camel case camelcase + 374:6 error Identifier 'jetpack_redirect' is not in camel case camelcase + 378:1 error Expected indentation of 6 tabs but found 7 indent + 378:8 error Identifier 'oauth2_client_id' is not in camel case camelcase + 379:1 error Expected indentation of 6 tabs but found 7 indent + 380:1 error Line 380 exceeds the maximum line length of 100 max-len + 380:1 error Expected indentation of 6 tabs but found 7 indent + 381:1 error Expected indentation of 6 tabs but found 7 indent + 381:1 error Line 381 exceeds the maximum line length of 100 max-len + 381:8 error Identifier 'oauth2_redirect' is not in camel case camelcase + 382:1 error Expected indentation of 5 tabs but found 6 indent + 386:1 error Line 386 exceeds the maximum line length of 100 max-len + 387:1 error Line 387 exceeds the maximum line length of 100 max-len + 387:50 error Identifier 'bearer_token' is not in camel case camelcase + 395:1 error Line 395 exceeds the maximum line length of 100 max-len + 399:7 error Identifier 'oauth2_client_id' is not in camel case camelcase + 400:7 error Identifier 'oauth2_redirect' is not in camel case camelcase + 410:3 error Unexpected var, use let or const instead no-var + 411:4 error Identifier 'blog_name' is not in camel case camelcase + 412:4 error Identifier 'blog_title' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/signup/test/dependency-store.js + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 46:71 error Identifier 'bearer_token' is not in camel case camelcase + 48:52 error Identifier 'bearer_token' is not in camel case camelcase + 51:4 error Identifier 'bearer_token' is not in camel case camelcase + 54:52 error Identifier 'bearer_token' is not in camel case camelcase + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + 65:52 error Identifier 'bearer_token' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/signup/test/flow-controller.js + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 67:72 error Identifier 'bearer_token' is not in camel case camelcase + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 76:72 error Identifier 'bearer_token' is not in camel case camelcase + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + 84:72 error Identifier 'bearer_token' is not in camel case camelcase + 101:40 error Identifier 'bearer_token' is not in camel case camelcase + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 124:1 error Line 124 exceeds the maximum line length of 100 max-len + 168:1 error Line 168 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/signup/test/mocks/signup/config/flows.js + 3:2 error Identifier 'simple_flow' is not in camel case camelcase + 8:2 error Identifier 'flow_with_async' is not in camel case camelcase + 12:2 error Identifier 'flow_with_dependencies' is not in camel case camelcase + 19:2 error Identifier 'invalid_flow_with_dependencies' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/signup/test/mocks/signup/config/steps.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 49:21 error Identifier 'bearer_token' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/signup/test/progress-store.js + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/signup/themes-data.js + 9:3 error Identifier 'demo_uri' is not in camel case camelcase + 18:3 error Identifier 'demo_uri' is not in camel case camelcase + 27:3 error Identifier 'demo_uri' is not in camel case camelcase + 36:3 error Identifier 'demo_uri' is not in camel case camelcase + 45:3 error Identifier 'demo_uri' is not in camel case camelcase + 54:3 error Identifier 'demo_uri' is not in camel case camelcase + 63:3 error Identifier 'demo_uri' is not in camel case camelcase + 72:3 error Identifier 'demo_uri' is not in camel case camelcase + 81:3 error Identifier 'demo_uri' is not in camel case camelcase + 90:3 error Identifier 'demo_uri' is not in camel case camelcase + 99:3 error Identifier 'demo_uri' is not in camel case camelcase + 108:3 error Identifier 'demo_uri' is not in camel case camelcase + 117:3 error Identifier 'demo_uri' is not in camel case camelcase + 126:3 error Identifier 'demo_uri' is not in camel case camelcase + 135:3 error Identifier 'demo_uri' is not in camel case camelcase + 144:3 error Identifier 'demo_uri' is not in camel case camelcase + 153:3 error Identifier 'demo_uri' is not in camel case camelcase + 162:3 error Identifier 'demo_uri' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/simple-payments/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/site/computed-attributes.js + 32:14 error Identifier 'wpcom_url' is not in camel case camelcase + 51:22 error Identifier 'default_post_format' is not in camel case camelcase + 55:13 error Identifier 'is_previewable' is not in camel case camelcase + 63:13 error Identifier 'is_customizable' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/site/index.js + 29:2 error Unexpected var, use let or const instead no-var + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + 60:8 error Unexpected var, use let or const instead no-var + 106:1 error Missing JSDoc for parameter 'siteID' valid-jsdoc + 111:2 error Unexpected var, use let or const instead no-var + 136:2 error Unexpected var, use let or const instead no-var + 137:3 error Unexpected var, use let or const instead no-var + 162:15 error Identifier 'jetpack_protect_whitelist' is not in camel case camelcase + 174:1 error Missing JSDoc @returns for function valid-jsdoc + 183:1 error Missing JSDoc @returns for function valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/site/jetpack.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 69:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/site/test/utils.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 37:6 error Identifier 'unmapped_url' is not in camel case camelcase + 38:6 error Identifier 'main_network_site' is not in camel case camelcase + 39:6 error Identifier 'is_multi_network' is not in camel case camelcase + 40:6 error Identifier 'file_mod_disabled' is not in camel case camelcase + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 49:5 error Identifier 'is_multisite' is not in camel case camelcase + 51:6 error Identifier 'unmapped_url' is not in camel case camelcase + 52:6 error Identifier 'main_network_site' is not in camel case camelcase + 53:6 error Identifier 'is_multi_network' is not in camel case camelcase + 54:6 error Identifier 'file_mod_disabled' is not in camel case camelcase + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 63:5 error Identifier 'is_multisite' is not in camel case camelcase + 65:6 error Identifier 'unmapped_url' is not in camel case camelcase + 66:6 error Identifier 'main_network_site' is not in camel case camelcase + 67:6 error Identifier 'is_multi_network' is not in camel case camelcase + 68:6 error Identifier 'file_mod_disabled' is not in camel case camelcase + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 77:5 error Identifier 'is_multisite' is not in camel case camelcase + 79:6 error Identifier 'unmapped_url' is not in camel case camelcase + 80:6 error Identifier 'main_network_site' is not in camel case camelcase + 81:6 error Identifier 'is_multi_network' is not in camel case camelcase + 82:6 error Identifier 'file_mod_disabled' is not in camel case camelcase + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 91:5 error Identifier 'is_multisite' is not in camel case camelcase + 93:6 error Identifier 'unmapped_url' is not in camel case camelcase + 94:6 error Identifier 'main_network_site' is not in camel case camelcase + 95:6 error Identifier 'is_multi_network' is not in camel case camelcase + 96:6 error Identifier 'file_mod_disabled' is not in camel case camelcase + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + 105:5 error Identifier 'is_multisite' is not in camel case camelcase + 107:6 error Identifier 'unmapped_url' is not in camel case camelcase + 108:6 error Identifier 'main_network_site' is not in camel case camelcase + 109:6 error Identifier 'is_multi_network' is not in camel case camelcase + 110:6 error Identifier 'file_mod_disabled' is not in camel case camelcase + 134:1 error Line 134 exceeds the maximum line length of 100 max-len + 136:5 error Identifier 'is_multisite' is not in camel case camelcase + 138:6 error Identifier 'unmapped_url' is not in camel case camelcase + 139:6 error Identifier 'main_network_site' is not in camel case camelcase + 145:1 error Line 145 exceeds the maximum line length of 100 max-len + 147:5 error Identifier 'is_multisite' is not in camel case camelcase + 149:6 error Identifier 'unmapped_url' is not in camel case camelcase + 150:6 error Identifier 'main_network_site' is not in camel case camelcase + 159:6 error Identifier 'is_multi_network' is not in camel case camelcase + 165:1 error Line 165 exceeds the maximum line length of 100 max-len + 167:5 error Identifier 'is_multisite' is not in camel case camelcase + 169:6 error Identifier 'unmapped_url' is not in camel case camelcase + 170:6 error Identifier 'main_network_site' is not in camel case camelcase + 176:1 error Line 176 exceeds the maximum line length of 100 max-len + 178:5 error Identifier 'is_multisite' is not in camel case camelcase + 180:6 error Identifier 'unmapped_url' is not in camel case camelcase + 181:6 error Identifier 'main_network_site' is not in camel case camelcase + 189:5 error Identifier 'is_multisite' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/site/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/sites-list/delete-site-store.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Unexpected var, use let or const instead no-var + 40:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/sites-list/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/sites-list/list.js + 25:1 error Missing JSDoc @returns for function valid-jsdoc + 48:1 error Missing JSDoc @returns for function valid-jsdoc + 53:2 error Unexpected var, use let or const instead no-var + 83:4 error Identifier 'site_visibility' is not in camel case camelcase + 84:4 error Identifier 'include_domain_only' is not in camel case camelcase + 121:6 error 'sites' is never reassigned. Use 'const' instead prefer-const + 127:7 error 'changed' is never reassigned. Use 'const' instead prefer-const + 137:1 error Missing JSDoc for parameter 'sites' valid-jsdoc + 141:2 error Unexpected var, use let or const instead no-var + 144:3 error Unexpected var, use let or const instead no-var + 155:1 error Missing JSDoc @returns for function valid-jsdoc + 155:1 error Missing JSDoc for parameter 'site' valid-jsdoc + 166:9 error Unnecessary 'else' after 'return' no-else-return + 170:1 error Missing JSDoc for parameter 'sites' valid-jsdoc + 179:3 error Unexpected var, use let or const instead no-var + 196:1 error Missing JSDoc parameter description for 'data' valid-jsdoc + 213:1 error Missing JSDoc @returns for function valid-jsdoc + 213:1 error Missing JSDoc for parameter 'sites' valid-jsdoc + 217:2 error Unexpected var, use let or const instead no-var + 227:3 error Unexpected var, use let or const instead no-var + 278:8 error Unexpected var, use let or const instead no-var + 294:4 error Unexpected var, use let or const instead no-var + 309:1 error Missing JSDoc @returns for function valid-jsdoc + 318:2 error Unexpected var, use let or const instead no-var + 342:1 error Missing JSDoc for parameter 'multisite' valid-jsdoc + 342:1 error Missing JSDoc @returns for function valid-jsdoc + 360:3 error 'sites' is never reassigned. Use 'const' instead prefer-const + 373:1 error Missing JSDoc @returns for function valid-jsdoc + 386:1 error Missing JSDoc @returns for function valid-jsdoc + 395:1 error Expected JSDoc for 'siteID' but found 'Site' valid-jsdoc + 410:1 error Missing JSDoc @returns for function valid-jsdoc + 410:1 error Missing JSDoc for parameter 'site' valid-jsdoc + 419:1 error Missing JSDoc for parameter 'siteID' valid-jsdoc + 419:1 error Missing JSDoc @returns for function valid-jsdoc + 443:1 error Missing JSDoc @returns for function valid-jsdoc + 452:1 error Missing JSDoc return type valid-jsdoc + 452:1 error Missing JSDoc for parameter 'siteID' valid-jsdoc + 460:2 error Unexpected var, use let or const instead no-var + 474:9 error Unnecessary 'else' after 'return' no-else-return + 499:1 error Missing JSDoc @returns for function valid-jsdoc + 519:1 error Line 519 exceeds the maximum line length of 100 max-len + 540:2 error Unexpected var, use let or const instead no-var + 555:1 error Expected JSDoc for 'updatedSite' but found 'site' valid-jsdoc + 560:2 error Unexpected var, use let or const instead no-var + 572:1 error Missing JSDoc return type valid-jsdoc + 577:2 error Unexpected var, use let or const instead no-var + 588:1 error Missing JSDoc return type valid-jsdoc + 596:10 error Unnecessary 'else' after 'return' no-else-return + 609:7 error 'siteUpdateInfo' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/sites-list/notices.js + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 118:1 error Line 118 exceeds the maximum line length of 100 max-len + 127:1 error Line 127 exceeds the maximum line length of 100 max-len + 146:1 error Line 146 exceeds the maximum line length of 100 max-len + 147:1 error Line 147 exceeds the maximum line length of 100 max-len + 153:1 error Line 153 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/sites-list/test/fixtures/data.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 16:3 error Identifier 'post_count' is not in camel case camelcase + 17:3 error Identifier 'subscribers_count' is not in camel case camelcase + 25:3 error Identifier 'is_private' is not in camel case camelcase + 26:3 error Identifier 'is_following' is not in camel case camelcase + 29:4 error Identifier 'gmt_offset' is not in camel case camelcase + 30:4 error Identifier 'videopress_enabled' is not in camel case camelcase + 31:4 error Identifier 'upgraded_filetypes_enabled' is not in camel case camelcase + 32:4 error Identifier 'login_url' is not in camel case camelcase + 33:4 error Identifier 'admin_url' is not in camel case camelcase + 34:4 error Identifier 'is_mapped_domain' is not in camel case camelcase + 35:4 error Identifier 'is_redirect' is not in camel case camelcase + 36:4 error Identifier 'unmapped_url' is not in camel case camelcase + 37:4 error Identifier 'featured_images_enabled' is not in camel case camelcase + 38:4 error Identifier 'theme_slug' is not in camel case camelcase + 39:4 error Identifier 'header_image' is not in camel case camelcase + 40:5 error Identifier 'attachment_id' is not in camel case camelcase + 42:5 error Identifier 'thumbnail_url' is not in camel case camelcase + 46:4 error Identifier 'background_color' is not in camel case camelcase + 47:4 error Identifier 'image_default_link_type' is not in camel case camelcase + 48:4 error Identifier 'image_thumbnail_width' is not in camel case camelcase + 49:4 error Identifier 'image_thumbnail_height' is not in camel case camelcase + 50:4 error Identifier 'image_thumbnail_crop' is not in camel case camelcase + 51:4 error Identifier 'image_medium_width' is not in camel case camelcase + 52:4 error Identifier 'image_medium_height' is not in camel case camelcase + 53:4 error Identifier 'image_large_width' is not in camel case camelcase + 54:4 error Identifier 'image_large_height' is not in camel case camelcase + 55:4 error Identifier 'permalink_structure' is not in camel case camelcase + 56:4 error Identifier 'post_formats' is not in camel case camelcase + 57:4 error Identifier 'default_post_format' is not in camel case camelcase + 58:4 error Identifier 'default_category' is not in camel case camelcase + 59:4 error Identifier 'allowed_file_types' is not in camel case camelcase + 76:4 error Identifier 'show_on_front' is not in camel case camelcase + 77:4 error Identifier 'default_likes_enabled' is not in camel case camelcase + 78:4 error Identifier 'default_sharing_status' is not in camel case camelcase + 79:4 error Identifier 'default_comment_status' is not in camel case camelcase + 80:4 error Identifier 'default_ping_status' is not in camel case camelcase + 81:4 error Identifier 'software_version' is not in camel case camelcase + 82:4 error Identifier 'created_at' is not in camel case camelcase + 84:4 error Identifier 'publicize_permanently_disabled' is not in camel case camelcase + 95:3 error Identifier 'user_can_manage' is not in camel case camelcase + 103:3 error Identifier 'post_count' is not in camel case camelcase + 104:3 error Identifier 'subscribers_count' is not in camel case camelcase + 107:3 error Identifier 'is_private' is not in camel case camelcase + 108:3 error Identifier 'is_following' is not in camel case camelcase + 111:4 error Identifier 'gmt_offset' is not in camel case camelcase + 112:4 error Identifier 'videopress_enabled' is not in camel case camelcase + 113:4 error Identifier 'login_url' is not in camel case camelcase + 114:4 error Identifier 'admin_url' is not in camel case camelcase + 115:4 error Identifier 'featured_images_enabled' is not in camel case camelcase + 116:4 error Identifier 'header_image' is not in camel case camelcase + 117:5 error Identifier 'attachment_id' is not in camel case camelcase + 118:1 error Line 118 exceeds the maximum line length of 100 max-len + 119:5 error Identifier 'thumbnail_url' is not in camel case camelcase + 124:4 error Identifier 'image_default_link_type' is not in camel case camelcase + 125:4 error Identifier 'image_thumbnail_width' is not in camel case camelcase + 126:4 error Identifier 'image_thumbnail_height' is not in camel case camelcase + 127:4 error Identifier 'image_thumbnail_crop' is not in camel case camelcase + 128:4 error Identifier 'image_medium_width' is not in camel case camelcase + 129:4 error Identifier 'image_medium_height' is not in camel case camelcase + 130:4 error Identifier 'image_large_width' is not in camel case camelcase + 131:4 error Identifier 'image_large_height' is not in camel case camelcase + 132:4 error Identifier 'post_formats' is not in camel case camelcase + 140:4 error Identifier 'default_likes_enabled' is not in camel case camelcase + 141:4 error Identifier 'default_sharing_status' is not in camel case camelcase + 142:4 error Identifier 'default_comment_status' is not in camel case camelcase + 143:4 error Identifier 'default_ping_status' is not in camel case camelcase + 144:4 error Identifier 'software_version' is not in camel case camelcase + 155:3 error Identifier 'user_can_manage' is not in camel case camelcase + 163:3 error Identifier 'post_count' is not in camel case camelcase + 164:3 error Identifier 'subscribers_count' is not in camel case camelcase + 171:3 error Identifier 'is_private' is not in camel case camelcase + 172:3 error Identifier 'is_following' is not in camel case camelcase + 175:4 error Identifier 'gmt_offset' is not in camel case camelcase + 176:4 error Identifier 'videopress_enabled' is not in camel case camelcase + 177:4 error Identifier 'login_url' is not in camel case camelcase + 178:4 error Identifier 'admin_url' is not in camel case camelcase + 179:4 error Identifier 'featured_images_enabled' is not in camel case camelcase + 180:4 error Identifier 'header_image' is not in camel case camelcase + 181:4 error Identifier 'image_default_link_type' is not in camel case camelcase + 182:4 error Identifier 'image_thumbnail_width' is not in camel case camelcase + 183:4 error Identifier 'image_thumbnail_height' is not in camel case camelcase + 184:4 error Identifier 'image_thumbnail_crop' is not in camel case camelcase + 185:4 error Identifier 'image_medium_width' is not in camel case camelcase + 186:4 error Identifier 'image_medium_height' is not in camel case camelcase + 187:4 error Identifier 'image_large_width' is not in camel case camelcase + 188:4 error Identifier 'image_large_height' is not in camel case camelcase + 189:4 error Identifier 'post_formats' is not in camel case camelcase + 197:4 error Identifier 'default_likes_enabled' is not in camel case camelcase + 198:4 error Identifier 'default_sharing_status' is not in camel case camelcase + 199:4 error Identifier 'default_comment_status' is not in camel case camelcase + 200:4 error Identifier 'default_ping_status' is not in camel case camelcase + 201:4 error Identifier 'software_version' is not in camel case camelcase + 212:3 error Identifier 'user_can_manage' is not in camel case camelcase + 220:3 error Identifier 'post_count' is not in camel case camelcase + 221:3 error Identifier 'subscribers_count' is not in camel case camelcase + 224:3 error Identifier 'is_private' is not in camel case camelcase + 225:3 error Identifier 'is_following' is not in camel case camelcase + 228:4 error Identifier 'gmt_offset' is not in camel case camelcase + 229:4 error Identifier 'videopress_enabled' is not in camel case camelcase + 230:4 error Identifier 'login_url' is not in camel case camelcase + 231:4 error Identifier 'admin_url' is not in camel case camelcase + 232:4 error Identifier 'featured_images_enabled' is not in camel case camelcase + 233:4 error Identifier 'header_image' is not in camel case camelcase + 234:4 error Identifier 'image_default_link_type' is not in camel case camelcase + 235:4 error Identifier 'image_thumbnail_width' is not in camel case camelcase + 236:4 error Identifier 'image_thumbnail_height' is not in camel case camelcase + 237:4 error Identifier 'image_thumbnail_crop' is not in camel case camelcase + 238:4 error Identifier 'image_medium_width' is not in camel case camelcase + 239:4 error Identifier 'image_medium_height' is not in camel case camelcase + 240:4 error Identifier 'image_large_width' is not in camel case camelcase + 241:4 error Identifier 'image_large_height' is not in camel case camelcase + 242:4 error Identifier 'post_formats' is not in camel case camelcase + 250:4 error Identifier 'default_likes_enabled' is not in camel case camelcase + 251:4 error Identifier 'default_sharing_status' is not in camel case camelcase + 252:4 error Identifier 'default_comment_status' is not in camel case camelcase + 253:4 error Identifier 'default_ping_status' is not in camel case camelcase + 254:4 error Identifier 'software_version' is not in camel case camelcase + 265:3 error Identifier 'user_can_manage' is not in camel case camelcase + 279:2 error Identifier 'post_count' is not in camel case camelcase + 280:2 error Identifier 'subscribers_count' is not in camel case camelcase + 283:2 error Identifier 'is_private' is not in camel case camelcase + 284:2 error Identifier 'is_following' is not in camel case camelcase + 287:3 error Identifier 'gmt_offset' is not in camel case camelcase + 288:3 error Identifier 'videopress_enabled' is not in camel case camelcase + 289:3 error Identifier 'login_url' is not in camel case camelcase + 290:3 error Identifier 'admin_url' is not in camel case camelcase + 291:3 error Identifier 'featured_images_enabled' is not in camel case camelcase + 292:3 error Identifier 'header_image' is not in camel case camelcase + 293:3 error Identifier 'image_default_link_type' is not in camel case camelcase + 294:3 error Identifier 'image_thumbnail_width' is not in camel case camelcase + 295:3 error Identifier 'image_thumbnail_height' is not in camel case camelcase + 296:3 error Identifier 'image_thumbnail_crop' is not in camel case camelcase + 297:3 error Identifier 'image_medium_width' is not in camel case camelcase + 298:3 error Identifier 'image_medium_height' is not in camel case camelcase + 299:3 error Identifier 'image_large_width' is not in camel case camelcase + 300:3 error Identifier 'image_large_height' is not in camel case camelcase + 301:3 error Identifier 'post_formats' is not in camel case camelcase + 309:3 error Identifier 'default_likes_enabled' is not in camel case camelcase + 310:3 error Identifier 'default_sharing_status' is not in camel case camelcase + 311:3 error Identifier 'default_comment_status' is not in camel case camelcase + 312:3 error Identifier 'default_ping_status' is not in camel case camelcase + 313:3 error Identifier 'software_version' is not in camel case camelcase + 324:2 error Identifier 'user_can_manage' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/sites-list/test/fixtures/site.js + 12:2 error Identifier 'is_following' is not in camel case camelcase + 13:2 error Identifier 'is_private' is not in camel case camelcase + 21:2 error Identifier 'post_count' is not in camel case camelcase + 22:2 error Identifier 'single_user_site' is not in camel case camelcase + 24:2 error Identifier 'subscribers_count' is not in camel case camelcase + 27:2 error Identifier 'jp_version' is not in camel case camelcase + 28:2 error Identifier 'user_can_manage' is not in camel case camelcase + 30:2 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/sites-list/test/mocks/lib/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/store-transactions/index.js + 29:1 error Expected JSDoc for 'params' but found 'cart' valid-jsdoc + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 56:1 error Missing JSDoc @returns for function valid-jsdoc + 68:2 error Unexpected var, use let or const instead no-var + 85:2 error Unexpected var, use let or const instead no-var + 95:2 error Identifier 'WPCOM_Billing_MoneyPress_Stored' is not in camel case camelcase + 97:12 error Identifier 'payment_key' is not in camel case camelcase + 98:4 error Identifier 'stored_details_id' is not in camel case camelcase + 99:4 error Identifier 'payment_partner' is not in camel case camelcase + 105:4 error Identifier 'payment_method' is not in camel case camelcase + 106:4 error Identifier 'payment_key' is not in camel case camelcase + 106:4 error Identifier 'payment_key' is not in camel case camelcase + 107:4 error Identifier 'payment_partner' is not in camel case camelcase + 107:4 error Identifier 'payment_partner' is not in camel case camelcase + 108:4 error Identifier 'stored_details_id' is not in camel case camelcase + 108:4 error Identifier 'stored_details_id' is not in camel case camelcase + 112:2 error Identifier 'WPCOM_Billing_MoneyPress_Paygate' is not in camel case camelcase + 134:6 error Identifier 'payment_method' is not in camel case camelcase + 135:6 error Identifier 'payment_key' is not in camel case camelcase + 144:2 error Identifier 'WPCOM_Billing_WPCOM' is not in camel case camelcase + 146:30 error Identifier 'payment_method' is not in camel case camelcase + 172:1 error Line 172 exceeds the maximum line length of 100 max-len + 172:2 error Unexpected var, use let or const instead no-var + 174:1 error Line 174 exceeds the maximum line length of 100 max-len + 175:4 error Identifier 'domain_details' is not in camel case camelcase + 206:4 error Identifier 'request_type' is not in camel case camelcase + 215:57 error 'error' is already declared in the upper scope no-shadow + 216:5 error Unexpected var, use let or const instead no-var + 253:3 error Identifier 'exp_month' is not in camel case camelcase + 254:3 error Identifier 'exp_year' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/store/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 31:3 error 'ReducerStore' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/string/index.js + 11:1 error JSDoc type missing brace valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/support/support-user/localstorage-bypass.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 68:13 error '_key' is never reassigned. Use 'const' instead prefer-const + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/text-utils/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/ticker/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 12:1 error Unexpected var, use let or const instead no-var + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/touch-detect/index.js + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/track-scroll-page/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/transaction/store.js + 21:1 error Unexpected var, use let or const instead no-var + 23:1 error Unexpected var, use let or const instead no-var + 71:2 error Unexpected var, use let or const instead no-var + 80:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/translator-jumpstart/index.js + 42:1 error Unexpected var, use let or const instead no-var + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + 109:1 error Line 109 exceeds the maximum line length of 100 max-len + 289:1 error Line 289 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/tree-convert/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 9:1 error Missing JSDoc @returns for function valid-jsdoc + 9:1 error Expected JSDoc for 'key' but found 'optional' valid-jsdoc + 29:2 error Unexpected var, use let or const instead no-var + 37:3 error Unexpected var, use let or const instead no-var + 69:2 error Unexpected var, use let or const instead no-var + 85:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/tree-convert/tree-traverser.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 9:1 error Missing JSDoc @returns for function valid-jsdoc + 9:1 error Missing JSDoc for parameter 'node' valid-jsdoc + 9:1 error Missing JSDoc for parameter 'tree' valid-jsdoc + 35:1 error Missing JSDoc @returns for function valid-jsdoc + 35:1 error Missing JSDoc for parameter 'node' valid-jsdoc + 35:1 error Missing JSDoc for parameter 'predicate' valid-jsdoc + 44:44 error 'node' is already declared in the upper scope no-shadow + 50:1 error Missing JSDoc for parameter 'node' valid-jsdoc + 50:1 error Missing JSDoc for parameter 'newNode' valid-jsdoc + 50:1 error Missing JSDoc for parameter 'predicate' valid-jsdoc + 54:2 error Unexpected var, use let or const instead no-var + 69:1 error Missing JSDoc for parameter 'array' valid-jsdoc + 69:1 error Missing JSDoc for parameter 'fn' valid-jsdoc + 69:1 error Missing JSDoc @returns for function valid-jsdoc + 74:2 error Unexpected var, use let or const instead no-var + 97:3 error Unexpected var, use let or const instead no-var + 108:2 error Missing JSDoc parameter description for 'filters' valid-jsdoc + 150:2 error Missing JSDoc parameter description for 'id' valid-jsdoc + 159:4 error Unexpected var, use let or const instead no-var + 167:2 error Missing JSDoc parameter description for 'srcItem' valid-jsdoc + 167:2 error Missing JSDoc parameter description for 'dstId' valid-jsdoc + 177:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/trophies-data/index.js + 30:2 error Unexpected var, use let or const instead no-var + 65:47 error 'TrophiesData' is already declared in the upper scope no-shadow + +/Users/seear/repos/wp-calypso/client/lib/two-step-authorization/index.js + 88:15 error Identifier 'two_step_reauthorization_required' is not in camel case camelcase + 89:15 error Identifier 'two_step_authorization_expires_soon' is not in camel case camelcase + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + 177:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/upgrades/actions/checkout.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/upgrades/actions/domain-management.js + 397:1 error Line 397 exceeds the maximum line length of 100 max-len + 433:1 error Line 433 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/upgrades/actions/domain-search.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/upgrades/actions/free-trials.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/upgrades/actions/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/upgrades/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/url/index.js + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/url/support.js + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/url/test/index.js + 349:1 error Line 349 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/user-profile-links/index.js + 132:55 error Identifier 'link_slug' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/user-settings/index.js + 29:3 error Identifier 'display_name' is not in camel case camelcase + 31:3 error Identifier 'user_URL' is not in camel case camelcase + 135:2 error Unexpected var, use let or const instead no-var + 179:6 error Identifier 'user_email_change_pending' is not in camel case camelcase + 240:2 error Unexpected var, use let or const instead no-var + 279:9 error Unnecessary 'else' after 'return' no-else-return + +/Users/seear/repos/wp-calypso/client/lib/user-settings/test/mocks/wp.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 10:7 error Identifier 'lang_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/user/index.js + 24:2 error Unexpected var, use let or const instead no-var + 39:2 error Unexpected var, use let or const instead no-var + 41:4 error Identifier 'visible_site_count' is not in camel case camelcase + 42:4 error Identifier 'site_count' is not in camel case camelcase + 50:4 error Identifier 'visible_site_count' is not in camel case camelcase + 51:4 error Identifier 'site_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/user/shared-utils.js + 22:2 error Unexpected var, use let or const instead no-var + 37:2 error Unexpected var, use let or const instead no-var + 43:3 error Unexpected var, use let or const instead no-var + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + 78:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/user/test/utils.js + 21:8 error 'configMock' is already declared in the upper scope no-shadow + 49:41 error Identifier 'logout_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/user/user.js + 23:1 error Missing JSDoc @returns for function valid-jsdoc + 89:1 error Missing JSDoc for parameter 'userId' valid-jsdoc + 94:2 error Unexpected var, use let or const instead no-var + 102:1 error Missing JSDoc @returns for function valid-jsdoc + 123:2 error Unexpected var, use let or const instead no-var + 138:1 error Line 138 exceeds the maximum line length of 100 max-len + 151:4 error Unexpected var, use let or const instead no-var + 175:2 error Unexpected var, use let or const instead no-var + 193:1 error Missing JSDoc @returns for function valid-jsdoc + 200:2 error Unexpected var, use let or const instead no-var + 200:6 error Identifier 'default_options' is not in camel case camelcase + 205:3 error Identifier 'avatar_URL' is not in camel case camelcase + 206:19 error Identifier 'avatar_URL' is not in camel case camelcase + 206:45 error Identifier 'avatar_URL' is not in camel case camelcase + 215:2 error Unexpected var, use let or const instead no-var + 243:1 error Missing JSDoc @returns for function valid-jsdoc + 243:1 error Missing JSDoc for parameter 'fn' valid-jsdoc + 255:2 error Unexpected var, use let or const instead no-var + 260:8 error Unexpected var, use let or const instead no-var + 261:1 error Line 261 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/user/utils.js + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/username/index.js + 17:1 error Missing JSDoc @returns for function valid-jsdoc + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/users/store.js + 18:1 error Unexpected var, use let or const instead no-var + 26:1 error Unexpected var, use let or const instead no-var + 29:3 error Unexpected var, use let or const instead no-var + 42:3 error Unexpected var, use let or const instead no-var + 154:2 error Unexpected var, use let or const instead no-var + 179:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/users/test/fixtures/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/users/test/fixtures/deleted-user.js + 7:4 error Identifier 'avatar_URL' is not in camel case camelcase + 11:4 error Identifier 'nice_name' is not in camel case camelcase + 12:4 error Identifier 'profile_URL' is not in camel case camelcase + 14:4 error Identifier 'site_ID' is not in camel case camelcase + 19:4 error Identifier 'avatar_URL' is not in camel case camelcase + 23:4 error Identifier 'nice_name' is not in camel case camelcase + 24:4 error Identifier 'profile_URL' is not in camel case camelcase + 26:4 error Identifier 'site_ID' is not in camel case camelcase + 31:4 error Identifier 'avatar_URL' is not in camel case camelcase + 35:4 error Identifier 'nice_name' is not in camel case camelcase + 36:4 error Identifier 'profile_URL' is not in camel case camelcase + 38:4 error Identifier 'site_ID' is not in camel case camelcase + 43:4 error Identifier 'avatar_URL' is not in camel case camelcase + 47:4 error Identifier 'nice_name' is not in camel case camelcase + 48:4 error Identifier 'profile_URL' is not in camel case camelcase + 50:4 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/users/test/fixtures/more-users.js + 7:4 error Identifier 'avatar_URL' is not in camel case camelcase + 11:4 error Identifier 'nice_name' is not in camel case camelcase + 12:4 error Identifier 'profile_URL' is not in camel case camelcase + 14:4 error Identifier 'site_ID' is not in camel case camelcase + 19:4 error Identifier 'avatar_URL' is not in camel case camelcase + 23:4 error Identifier 'nice_name' is not in camel case camelcase + 24:4 error Identifier 'profile_URL' is not in camel case camelcase + 26:4 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/users/test/fixtures/single-user.js + 4:2 error Identifier 'avatar_URL' is not in camel case camelcase + 8:2 error Identifier 'nice_name' is not in camel case camelcase + 9:2 error Identifier 'profile_URL' is not in camel case camelcase + 11:2 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/users/test/fixtures/site.js + 12:2 error Identifier 'is_following' is not in camel case camelcase + 13:2 error Identifier 'is_private' is not in camel case camelcase + 22:2 error Identifier 'post_count' is not in camel case camelcase + 23:2 error Identifier 'single_user_site' is not in camel case camelcase + 25:2 error Identifier 'subscribers_count' is not in camel case camelcase + 28:2 error Identifier 'jp_version' is not in camel case camelcase + 29:2 error Identifier 'user_can_manage' is not in camel case camelcase + 31:2 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/users/test/fixtures/updated-single-user.js + 4:2 error Identifier 'avatar_URL' is not in camel case camelcase + 8:2 error Identifier 'nice_name' is not in camel case camelcase + 9:2 error Identifier 'profile_URL' is not in camel case camelcase + 11:2 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/users/test/fixtures/users.js + 7:4 error Identifier 'avatar_URL' is not in camel case camelcase + 11:4 error Identifier 'nice_name' is not in camel case camelcase + 12:4 error Identifier 'profile_URL' is not in camel case camelcase + 14:4 error Identifier 'site_ID' is not in camel case camelcase + 19:4 error Identifier 'avatar_URL' is not in camel case camelcase + 23:4 error Identifier 'nice_name' is not in camel case camelcase + 24:4 error Identifier 'profile_URL' is not in camel case camelcase + 26:4 error Identifier 'site_ID' is not in camel case camelcase + 31:4 error Identifier 'avatar_URL' is not in camel case camelcase + 35:4 error Identifier 'nice_name' is not in camel case camelcase + 36:4 error Identifier 'profile_URL' is not in camel case camelcase + 38:4 error Identifier 'site_ID' is not in camel case camelcase + 43:4 error Identifier 'avatar_URL' is not in camel case camelcase + 47:4 error Identifier 'nice_name' is not in camel case camelcase + 48:4 error Identifier 'profile_URL' is not in camel case camelcase + 50:4 error Identifier 'site_ID' is not in camel case camelcase + 55:4 error Identifier 'avatar_URL' is not in camel case camelcase + 59:4 error Identifier 'nice_name' is not in camel case camelcase + 60:4 error Identifier 'profile_URL' is not in camel case camelcase + 62:4 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/users/test/store.js + 20:2 error Unexpected var, use let or const instead no-var + 49:4 error 'user' is never reassigned. Use 'const' instead prefer-const + 77:1 error Line 77 exceeds the maximum line length of 100 max-len + 80:4 error 'lessUsers' is never reassigned. Use 'const' instead prefer-const + 87:4 error 'moreUsers' is never reassigned. Use 'const' instead prefer-const + 162:4 error 'usersAgain' is never reassigned. Use 'const' instead prefer-const + 174:4 error 'userAgain' is never reassigned. Use 'const' instead prefer-const + 178:4 error 'userRestored' is never reassigned. Use 'const' instead prefer-const + 205:4 error 'userRestored' is never reassigned. Use 'const' instead prefer-const + 212:4 error 'users' is never reassigned. Use 'const' instead prefer-const + 213:4 error 'someUndefined' is never reassigned. Use 'const' instead prefer-const + 227:4 error 'usersAgain' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/version-compare/index.js + 7:1 error Missing JSDoc @returns for function valid-jsdoc + 7:1 error Missing JSDoc for parameter 'v1' valid-jsdoc + 7:1 error Missing JSDoc for parameter 'v2' valid-jsdoc + 7:1 error Missing JSDoc for parameter 'operator' valid-jsdoc + 11:10 error Identifier 'version_compare' is not in camel case camelcase + 29:2 error Unexpected var, use let or const instead no-var + 69:2 error Unexpected var, use let or const instead no-var + 70:10 error Do not nest ternary expressions no-nested-ternary + 76:16 error Expected '===' and instead saw '==' eqeqeq + 124:16 error Identifier 'version_compare' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/viewers/actions.js + 17:1 error Unexpected var, use let or const instead no-var + 19:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/viewers/store.js + 17:1 error Unexpected var, use let or const instead no-var + 24:1 error Unexpected var, use let or const instead no-var + 102:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/viewers/test/fixtures/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/viewers/test/fixtures/site.js + 12:2 error Identifier 'is_following' is not in camel case camelcase + 13:2 error Identifier 'is_private' is not in camel case camelcase + 22:2 error Identifier 'post_count' is not in camel case camelcase + 23:2 error Identifier 'single_user_site' is not in camel case camelcase + 25:2 error Identifier 'subscribers_count' is not in camel case camelcase + 28:2 error Identifier 'jp_version' is not in camel case camelcase + 29:2 error Identifier 'user_can_manage' is not in camel case camelcase + 31:2 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/viewers/test/fixtures/viewers-1.js + 7:4 error Identifier 'avatar_URL' is not in camel case camelcase + 8:1 error Line 8 exceeds the maximum line length of 100 max-len + 12:4 error Identifier 'nice_name' is not in camel case camelcase + 13:4 error Identifier 'profile_URL' is not in camel case camelcase + 14:4 error Identifier 'site_ID' is not in camel case camelcase + 18:4 error Identifier 'avatar_URL' is not in camel case camelcase + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 23:4 error Identifier 'nice_name' is not in camel case camelcase + 24:4 error Identifier 'profile_URL' is not in camel case camelcase + 25:4 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/viewers/test/fixtures/viewers-2.js + 7:4 error Identifier 'avatar_URL' is not in camel case camelcase + 11:4 error Identifier 'nice_name' is not in camel case camelcase + 12:4 error Identifier 'profile_URL' is not in camel case camelcase + 13:4 error Identifier 'site_ID' is not in camel case camelcase + 17:4 error Identifier 'avatar_URL' is not in camel case camelcase + 21:4 error Identifier 'nice_name' is not in camel case camelcase + 22:4 error Identifier 'profile_URL' is not in camel case camelcase + 23:4 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/viewers/test/store.js + 55:4 error 'viewers' is never reassigned. Use 'const' instead prefer-const + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 134:4 error 'viewersAfterRemove' is never reassigned. Use 'const' instead prefer-const + 138:4 error 'viewersAfterError' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/lib/viewport/index.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 32:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/warn/index.js + 13:64 error Unexpected console statement no-console + 14:24 error Unexpected console statement no-console + +/Users/seear/repos/wp-calypso/client/lib/wp/handlers/guest-sandbox-ticket.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 45:51 error Identifier 'store_sandbox_ticket' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/wp/node.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/wp/support.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 21:7 error 'query' is never reassigned. Use 'const' instead prefer-const + 24:9 error Identifier 'support_user' is not in camel case camelcase + 25:9 error Identifier '_support_token' is not in camel case camelcase + 46:3 error Expected JSDoc for 'newUser' but found 'supportUser' valid-jsdoc + 46:3 error Expected JSDoc for 'newToken' but found 'supportToken' valid-jsdoc + 46:3 error Missing JSDoc for parameter 'newTokenErrorCallback' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/wp/sync-handler/cache-index.js + 157:66 error Unquoted reserved word 'long' used as key quote-props + +/Users/seear/repos/wp-calypso/client/lib/wp/sync-handler/index.js + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + 113:1 error Line 113 exceeds the maximum line length of 100 max-len + 150:1 error Line 150 exceeds the maximum line length of 100 max-len + 235:1 error Line 235 exceeds the maximum line length of 100 max-len + 243:1 error Line 243 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/wp/sync-handler/test/cache-index.js + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + 145:1 error Line 145 exceeds the maximum line length of 100 max-len + 171:1 error Line 171 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/wp/sync-handler/test/data/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 76:3 error Identifier 'next_page' is not in camel case camelcase + 86:3 error Identifier 'next_page' is not in camel case camelcase + 96:3 error Identifier 'next_page' is not in camel case camelcase + 106:3 error Identifier 'next_page' is not in camel case camelcase + 116:3 error Identifier 'next_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/wp/sync-handler/test/index.js + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 198:1 error Line 198 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/wp/sync-handler/test/mocks/localforage.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/wp/sync-handler/utils.js + 24:2 error Unexpected var, use let or const instead no-var + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/wp/sync-handler/whitelist-handler.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/wpcom-undocumented/lib/mailing-list.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 100:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/wpcom-undocumented/lib/me-preferences.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/wpcom-undocumented/lib/me.js + 43:2 error Unexpected var, use let or const instead no-var + 64:2 error Unexpected var, use let or const instead no-var + 73:2 error Unexpected var, use let or const instead no-var + 82:2 error Unexpected var, use let or const instead no-var + 91:2 error Unexpected var, use let or const instead no-var + 100:2 error Unexpected var, use let or const instead no-var + 104:4 error Identifier 'application_name' is not in camel case camelcase + 112:2 error Unexpected var, use let or const instead no-var + 124:2 error Unexpected var, use let or const instead no-var + 133:2 error Unexpected var, use let or const instead no-var + 143:2 error Unexpected var, use let or const instead no-var + 152:2 error Unexpected var, use let or const instead no-var + 161:2 error Unexpected var, use let or const instead no-var + 169:2 error Unexpected var, use let or const instead no-var + 178:2 error Unexpected var, use let or const instead no-var + 190:1 error Missing JSDoc @returns for function valid-jsdoc + 205:4 error Identifier 'payment_key' is not in camel case camelcase + 206:4 error Identifier 'use_for_existing' is not in camel case camelcase + 213:2 error Unexpected var, use let or const instead no-var + 220:2 error Unexpected var, use let or const instead no-var + 229:2 error Unexpected var, use let or const instead no-var + 236:2 error Unexpected var, use let or const instead no-var + 257:2 error Unexpected var, use let or const instead no-var + 274:1 error Line 274 exceeds the maximum line length of 100 max-len + 278:2 error Unexpected var, use let or const instead no-var + 297:2 error Unexpected var, use let or const instead no-var + 306:2 error Unexpected var, use let or const instead no-var + 311:4 error Identifier 'phone_number' is not in camel case camelcase + 319:2 error Unexpected var, use let or const instead no-var + 328:2 error Unexpected var, use let or const instead no-var + 337:2 error Unexpected var, use let or const instead no-var + 347:2 error Unexpected var, use let or const instead no-var + 359:2 error Unexpected var, use let or const instead no-var + 368:2 error Unexpected var, use let or const instead no-var + 387:1 error Expected JSDoc for 'fn' but found 'access_token' valid-jsdoc + 399:13 error Identifier 'access_token' is not in camel case camelcase + 399:27 error Identifier 'id_token' is not in camel case camelcase + 399:37 error Identifier 'redirect_to' is not in camel case camelcase + 404:3 error Identifier 'access_token' is not in camel case camelcase + 404:3 error Identifier 'access_token' is not in camel case camelcase + 405:3 error Identifier 'id_token' is not in camel case camelcase + 405:3 error Identifier 'id_token' is not in camel case camelcase + 406:3 error Identifier 'redirect_to' is not in camel case camelcase + 406:3 error Identifier 'redirect_to' is not in camel case camelcase + 409:3 error Identifier 'client_id' is not in camel case camelcase + 410:3 error Identifier 'client_secret' is not in camel case camelcase + 443:3 error Identifier 'client_id' is not in camel case camelcase + 444:3 error Identifier 'client_secret' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/wpcom-undocumented/lib/site.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:1 error Unexpected var, use let or const instead no-var + 26:1 error Unexpected var, use let or const instead no-var + 28:3 error Unexpected var, use let or const instead no-var + 33:4 error Unexpected var, use let or const instead no-var + 52:10 error Unnecessary 'else' after 'return' no-else-return + 60:2 error Unexpected var, use let or const instead no-var + 118:2 error Unexpected var, use let or const instead no-var + 130:4 error Identifier 'maybe_embed' is not in camel case camelcase + 207:4 error Identifier 'option_name' is not in camel case camelcase + 208:4 error Identifier 'is_array' is not in camel case camelcase + 209:4 error Identifier 'site_option' is not in camel case camelcase + 211:5 error Identifier 'option_value' is not in camel case camelcase + 217:6 error 'query' is never reassigned. Use 'const' instead prefer-const + 254:1 error Expected JSDoc for 'hostDetails' but found 'siteId' valid-jsdoc + 299:4 error Identifier 'external_ids' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/lib/wpcom-undocumented/lib/undocumented.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 32:8 error Identifier 'client_id' is not in camel case camelcase + 33:8 error Identifier 'client_secret' is not in camel case camelcase + 55:6 error 'query' is never reassigned. Use 'const' instead prefer-const + 241:1 error Missing JSDoc @returns for function valid-jsdoc + 253:1 error Missing JSDoc @returns for function valid-jsdoc + 265:1 error Missing JSDoc @returns for function valid-jsdoc + 287:5 error Identifier 'email_notifications' is not in camel case camelcase + 287:46 error Identifier 'wp_note_notifications' is not in camel case camelcase + 292:1 error Missing JSDoc @returns for function valid-jsdoc + 304:1 error Missing JSDoc @returns for function valid-jsdoc + 316:1 error Missing JSDoc @returns for function valid-jsdoc + 366:57 error Identifier '_wp_nonce' is not in camel case camelcase + 366:68 error Identifier 'redirect_uri' is not in camel case camelcase + 369:19 error Identifier '_wp_nonce' is not in camel case camelcase + 369:19 error Identifier '_wp_nonce' is not in camel case camelcase + 369:30 error Identifier 'redirect_uri' is not in camel case camelcase + 369:30 error Identifier 'redirect_uri' is not in camel case camelcase + 377:2 error Identifier 'redirect_uri' is not in camel case camelcase + 379:2 error Identifier 'jp_version' is not in camel case camelcase + 383:32 error Identifier 'redirect_uri' is not in camel case camelcase + 383:32 error Identifier 'redirect_uri' is not in camel case camelcase + 383:54 error Identifier 'jp_version' is not in camel case camelcase + 383:54 error Identifier 'jp_version' is not in camel case camelcase + 390:19 error Identifier 'sso_nonce' is not in camel case camelcase + 397:19 error Identifier 'sso_nonce' is not in camel case camelcase + 407:1 error Missing JSDoc @returns for function valid-jsdoc + 420:1 error Missing JSDoc @returns for function valid-jsdoc + 458:4 error Identifier 'include_domain_only' is not in camel case camelcase + 492:1 error Missing JSDoc @returns for function valid-jsdoc + 526:1 error Line 526 exceeds the maximum line length of 100 max-len + 580:1 error Line 580 exceeds the maximum line length of 100 max-len + 583:1 error Missing JSDoc @returns for function valid-jsdoc + 596:1 error Missing JSDoc @returns for function valid-jsdoc + 614:1 error Missing JSDoc @returns for function valid-jsdoc + 629:4 error Unexpected var, use let or const instead no-var + 688:3 error Unexpected var, use let or const instead no-var + 698:1 error Missing JSDoc @returns for function valid-jsdoc + 711:2 error Unexpected var, use let or const instead no-var + 723:3 error Unexpected var, use let or const instead no-var + 768:1 error Missing JSDoc @returns for function valid-jsdoc + 785:1 error Missing JSDoc @returns for function valid-jsdoc + 809:1 error Missing JSDoc @returns for function valid-jsdoc + 839:1 error Missing JSDoc @returns for function valid-jsdoc + 868:1 error Missing JSDoc @returns for function valid-jsdoc + 880:1 error Missing JSDoc @returns for function valid-jsdoc + 899:1 error Missing JSDoc @returns for function valid-jsdoc + 912:1 error Missing JSDoc @returns for function valid-jsdoc + 932:1 error Missing JSDoc @returns for function valid-jsdoc + 945:12 error Identifier 'sharing_buttons' is not in camel case camelcase + 970:1 error Missing JSDoc @returns for function valid-jsdoc + 1025:1 error Missing JSDoc @returns for function valid-jsdoc + 1055:2 error Unexpected var, use let or const instead no-var + 1064:11 error Identifier 'keyring_connection_ID' is not in camel case camelcase + 1070:8 error Identifier 'external_user_ID' is not in camel case camelcase + 1080:1 error JSDoc syntax error valid-jsdoc + 1091:17 error Identifier 'skipped_connections' is not in camel case camelcase + 1096:8 error Identifier 'skipped_connections' is not in camel case camelcase + 1115:2 error Unexpected var, use let or const instead no-var + 1135:1 error Missing JSDoc @returns for function valid-jsdoc + 1174:7 error Identifier 'paygate_token' is not in camel case camelcase + 1176:1 error Line 1176 exceeds the maximum line length of 100 max-len + 1179:1 error Missing JSDoc @returns for function valid-jsdoc + 1192:1 error Missing JSDoc @returns for function valid-jsdoc + 1213:1 error Missing JSDoc @returns for function valid-jsdoc + 1232:1 error Missing JSDoc @returns for function valid-jsdoc + 1242:1 error Line 1242 exceeds the maximum line length of 100 max-len + 1255:33 error 'reject' is already declared in the upper scope no-shadow + 1279:10 error Identifier 'content_width' is not in camel case camelcase + 1317:2 error Unexpected var, use let or const instead no-var + 1328:2 error Unexpected var, use let or const instead no-var + 1341:2 error Unexpected var, use let or const instead no-var + 1364:2 error Unexpected var, use let or const instead no-var + 1409:2 error Unexpected var, use let or const instead no-var + 1417:2 error Unexpected var, use let or const instead no-var + 1424:2 error Unexpected var, use let or const instead no-var + 1446:2 error Unexpected var, use let or const instead no-var + 1461:2 error Unexpected var, use let or const instead no-var + 1476:2 error Unexpected var, use let or const instead no-var + 1491:2 error Unexpected var, use let or const instead no-var + 1506:2 error Unexpected var, use let or const instead no-var + 1521:2 error Unexpected var, use let or const instead no-var + 1527:2 error Unexpected var, use let or const instead no-var + 1533:2 error Unexpected var, use let or const instead no-var + 1540:2 error Unexpected var, use let or const instead no-var + 1567:1 error Missing JSDoc @returns for function valid-jsdoc + 1576:2 error Unexpected var, use let or const instead no-var + 1589:1 error Missing JSDoc @returns for function valid-jsdoc + 1597:2 error Unexpected var, use let or const instead no-var + 1615:1 error Line 1615 exceeds the maximum line length of 100 max-len + 1634:1 error Missing JSDoc @returns for function valid-jsdoc + 1641:2 error Unexpected var, use let or const instead no-var + 1654:1 error Missing JSDoc @returns for function valid-jsdoc + 1661:2 error Unexpected var, use let or const instead no-var + 1674:1 error Missing JSDoc @returns for function valid-jsdoc + 1678:1 error Line 1678 exceeds the maximum line length of 100 max-len + 1682:2 error Unexpected var, use let or const instead no-var + 1695:1 error Missing JSDoc @returns for function valid-jsdoc + 1702:2 error Unexpected var, use let or const instead no-var + 1715:1 error Missing JSDoc @returns for function valid-jsdoc + 1722:2 error Unexpected var, use let or const instead no-var + 1735:1 error Missing JSDoc @returns for function valid-jsdoc + 1739:1 error Line 1739 exceeds the maximum line length of 100 max-len + 1743:2 error Unexpected var, use let or const instead no-var + 1756:1 error Missing JSDoc @returns for function valid-jsdoc + 1780:7 error Identifier 'lang_id' is not in camel case camelcase + 1792:1 error Missing JSDoc @returns for function valid-jsdoc + 1799:2 error Unexpected var, use let or const instead no-var + 1807:8 error Identifier 'lang_id' is not in camel case camelcase + 1819:1 error Missing JSDoc @returns for function valid-jsdoc + 1831:2 error Unexpected var, use let or const instead no-var + 1851:1 error Line 1851 exceeds the maximum line length of 100 max-len + 1852:1 error Line 1852 exceeds the maximum line length of 100 max-len + 2043:2 error Unexpected var, use let or const instead no-var + 2106:6 error Identifier 'disable_privacy' is not in camel case camelcase + 2122:5 error Identifier 'enable_privacy' is not in camel case camelcase + 2123:5 error Identifier 'decline_transfer' is not in camel case camelcase + 2124:5 error Identifier 'lock_domain' is not in camel case camelcase + 2133:2 error Unexpected var, use let or const instead no-var + 2141:2 error Unexpected var, use let or const instead no-var + 2149:2 error Unexpected var, use let or const instead no-var + 2205:5 error Identifier 'transfer_lock' is not in camel case camelcase + 2299:33 error 'reject' is already declared in the upper scope no-shadow + 2320:1 error Missing JSDoc @returns for function valid-jsdoc + 2436:1 error Missing JSDoc @returns for function valid-jsdoc + 2525:6 error 'query' is never reassigned. Use 'const' instead prefer-const + 2538:1 error Line 2538 exceeds the maximum line length of 100 max-len + 2539:6 error 'params' is never reassigned. Use 'const' instead prefer-const + 2563:4 error Identifier 'jetpack_connect' is not in camel case camelcase + 2568:1 error Missing JSDoc @returns for function valid-jsdoc + 2621:4 error Identifier 'device_token' is not in camel case camelcase + 2622:4 error Identifier 'device_family' is not in camel case camelcase + 2623:4 error Identifier 'device_name' is not in camel case camelcase + 2641:1 error Missing JSDoc return description valid-jsdoc + 2652:1 error Missing JSDoc for parameter 'fn' valid-jsdoc + 2652:1 error Missing JSDoc return description valid-jsdoc + 2701:1 error Line 2701 exceeds the maximum line length of 100 max-len + 2727:1 error Missing JSDoc return description valid-jsdoc + 2743:1 error Missing JSDoc return description valid-jsdoc + 2758:1 error Missing JSDoc return description valid-jsdoc + +/Users/seear/repos/wp-calypso/client/lib/wpcom-xhr-wrapper/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/lib/wporg/index.js + 23:1 error Unexpected var, use let or const instead no-var + 31:2 error Unexpected var, use let or const instead no-var + 50:3 error Unexpected var, use let or const instead no-var + 76:3 error Unexpected var, use let or const instead no-var + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 134:1 error Line 134 exceeds the maximum line length of 100 max-len + 141:1 error Line 141 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/wporg/jsonp.js + 2:1 error Line 2 exceeds the maximum line length of 100 max-len + 23:1 error Unexpected var, use let or const instead no-var + 30:1 error Missing JSDoc parameter description for 'url' valid-jsdoc + 30:1 error Missing JSDoc @returns for function valid-jsdoc + 30:1 error Expected JSDoc for 'fn' but found 'optional' valid-jsdoc + 38:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/lib/wrap-es6-functions/index.js + 13:22 error Unexpected console statement no-console + 13:39 error Unexpected console statement no-console + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/lib/wrap-es6-functions/test/index.js + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/login/controller.js + 40:20 error Identifier 'client_id' is not in camel case camelcase + 40:31 error Identifier 'redirect_to' is not in camel case camelcase + 42:8 error Identifier 'client_id' is not in camel case camelcase + 43:11 error Identifier 'redirect_to' is not in camel case camelcase + 52:9 error Identifier 'client_id' is not in camel case camelcase + 95:11 error Identifier 'client_id' is not in camel case camelcase + 99:16 error Identifier 'client_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/login/index.node.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/login/index.web.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/me/account/controller.js + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/me/billing-history/table-rows.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 25:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/me/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 11:1 error Line 11 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/me/controller.js + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 87:59 error Identifier 'is_welcome' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/me/event-recorder/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 46:4 error Unexpected var, use let or const instead no-var + 59:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/me/form-base/index.js + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/me/help/help-courses/constants.js + 9:1 error Line 9 exceeds the maximum line length of 100 max-len + 11:1 error Line 11 exceeds the maximum line length of 100 max-len + 12:1 error Line 12 exceeds the maximum line length of 100 max-len + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/me/help/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/me/index.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/me/next-steps/steps.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + 71:6 error Translations should not contain collapsible whitespace (consecutive spaces) wpcalypso/i18n-no-collapsible-whitespace + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 132:1 error Line 132 exceeds the maximum line length of 100 max-len + 147:1 error Line 147 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/me/notification-settings/settings-form/locales.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:2 error Identifier 'comment_like' is not in camel case camelcase + 11:2 error Identifier 'comment_reply' is not in camel case camelcase + 13:2 error Identifier 'new_comment' is not in camel case camelcase + 14:2 error Identifier 'post_like' is not in camel case camelcase + 18:2 error Identifier 'scheduled_publicize' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/me/purchases/confirm-cancel-domain/cancellation-reasons.js + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/me/purchases/index.js + 99:1 error Line 99 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/me/purchases/paths.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + +/Users/seear/repos/wp-calypso/client/me/purchases/titles.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/me/purchases/utils.js + 75:3 error Identifier 'product_slug' is not in camel case camelcase + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/ads/controller.js + 26:2 error Unexpected var, use let or const instead no-var + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/checkout/cart/test/cart-buttons.js + 22:8 error 'recordStub' is already declared in the upper scope no-shadow + +/Users/seear/repos/wp-calypso/client/my-sites/checkout/checkout-thank-you/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/checkout/checkout/free-trial-confirmation-box.js + 23:10 error className should follow CSS namespace guidelines (expected checkout__ prefix) wpcalypso/jsx-classname-namespace + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 38:10 error className should follow CSS namespace guidelines (expected checkout__ prefix) wpcalypso/jsx-classname-namespace + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/checkout/checkout/test/domain-details-form.js + 64:4 error Identifier 'privacy_available' is not in camel case camelcase + 71:4 error Identifier 'privacy_available' is not in camel case camelcase + 139:1 error Line 139 exceeds the maximum line length of 100 max-len + 181:1 error Line 181 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/comments/controller.js + 103:1 error Line 103 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/controller.js + 62:1 error 'state/selectors' import is duplicated no-duplicate-imports + 128:8 error Identifier 'signup_url' is not in camel case camelcase + 154:28 error Identifier 'signup_url' is not in camel case camelcase + 242:1 error Line 242 exceeds the maximum line length of 100 max-len + 276:20 error Identifier 'primary_blog' is not in camel case camelcase + 276:34 error Identifier 'primary_blog_url' is not in camel case camelcase + 276:52 error Identifier 'primary_blog_is_jetpack' is not in camel case camelcase + 279:3 error Identifier 'primary_blog' is not in camel case camelcase + 279:3 error Identifier 'primary_blog' is not in camel case camelcase + 280:3 error Identifier 'primary_blog_url' is not in camel case camelcase + 280:3 error Identifier 'primary_blog_url' is not in camel case camelcase + 281:3 error Identifier 'primary_blog_is_jetpack' is not in camel case camelcase + 281:3 error Identifier 'primary_blog_is_jetpack' is not in camel case camelcase + 286:1 error Line 286 exceeds the maximum line length of 100 max-len + 332:1 error Line 332 exceeds the maximum line length of 100 max-len + 408:1 error Line 408 exceeds the maximum line length of 100 max-len + 474:1 error Line 474 exceeds the maximum line length of 100 max-len + 491:1 error Line 491 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/customize/actions.js + 18:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/my-sites/design-preview/index.js + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + 180:1 error Line 180 exceeds the maximum line length of 100 max-len + 225:1 error Line 225 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/domains/components/domain-warnings/pending-gapps-tos-notice-multiple-domain-list-item.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/domains/components/domain-warnings/test/index.js + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 139:1 error Line 139 exceeds the maximum line length of 100 max-len + 167:1 error Line 167 exceeds the maximum line length of 100 max-len + 190:1 error Line 190 exceeds the maximum line length of 100 max-len + 221:1 error Line 221 exceeds the maximum line length of 100 max-len + 268:1 error Line 268 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/domains/components/form/test/hidden-input.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/domains/domain-management/domain-connect/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/domains/domain-management/list/test/index.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 146:1 error Line 146 exceeds the maximum line length of 100 max-len + 200:1 error Line 200 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/domains/domain-management/transfer/transfer-out/shared.js + 18:3 error Identifier 'unlock_domain_and_disable_private_reg_failed' is not in camel case camelcase + 23:3 error Identifier 'unlock_domain_failed' is not in camel case camelcase + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 26:3 error Identifier 'disable_private_reg_failed' is not in camel case camelcase + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/domains/index.js + 19:31 error 'paths' is already declared in the upper scope no-shadow + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/domains/map-domain/test/map-domain.js + 25:8 error 'pageSpy' is already declared in the upper scope no-shadow + 75:1 error Line 75 exceeds the maximum line length of 100 max-len + 89:52 error Identifier 'is_vip' is not in camel case camelcase + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/domains/paths.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/importer/dispatcher-converter.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/invites/controller.js + 44:7 error 'urlWithoutLocale' is never reassigned. Use 'const' instead prefer-const + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 62:16 error Identifier 'email_verified' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/my-sites/invites/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:42 error className should follow CSS namespace guidelines (expected invites__ prefix) wpcalypso/jsx-classname-namespace + 47:11 error className should follow CSS namespace guidelines (expected invites__ prefix) wpcalypso/jsx-classname-namespace + 52:10 error className should follow CSS namespace guidelines (expected invites__ prefix) wpcalypso/jsx-classname-namespace + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + 67:11 error className should follow CSS namespace guidelines (expected invites__ prefix) wpcalypso/jsx-classname-namespace + 72:10 error className should follow CSS namespace guidelines (expected invites__ prefix) wpcalypso/jsx-classname-namespace + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 84:11 error className should follow CSS namespace guidelines (expected invites__ prefix) wpcalypso/jsx-classname-namespace + 89:10 error className should follow CSS namespace guidelines (expected invites__ prefix) wpcalypso/jsx-classname-namespace + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + 101:11 error className should follow CSS namespace guidelines (expected invites__ prefix) wpcalypso/jsx-classname-namespace + 106:10 error className should follow CSS namespace guidelines (expected invites__ prefix) wpcalypso/jsx-classname-namespace + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/media-library/filter-to-mime-prefix.js + 18:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/my-sites/media-library/list-plan-promo.js + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 94:12 error className should follow CSS namespace guidelines (expected media-library__ prefix) wpcalypso/jsx-classname-namespace + +/Users/seear/repos/wp-calypso/client/my-sites/media-library/test/fixtures/index.js + 61:5 error Identifier 'fmt_hd' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/my-sites/media/controller.js + 21:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/my-sites/pages/controller.js + 22:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/my-sites/pages/helpers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/pages/page/index.js + 35:1 error 'lib/posts/utils' import is duplicated no-duplicate-imports + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + 193:1 error Line 193 exceeds the maximum line length of 100 max-len + 204:1 error Line 204 exceeds the maximum line length of 100 max-len + 213:1 error Line 213 exceeds the maximum line length of 100 max-len + 240:1 error Line 240 exceeds the maximum line length of 100 max-len + 295:5 error Unquoted reserved word 'private' used as key quote-props + 350:15 error Using this.refs is deprecated react/no-string-refs + 350:28 error Using this.refs is deprecated react/no-string-refs + 371:5 error Using string literals in ref attributes is deprecated react/no-string-refs + 404:1 error Line 404 exceeds the maximum line length of 100 max-len + 406:1 error Line 406 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/pages/test/helpers.js + 63:6 error Identifier 'menu_order' is not in camel case camelcase + 68:6 error Identifier 'menu_order' is not in camel case camelcase + 75:6 error Identifier 'menu_order' is not in camel case camelcase + 82:6 error Identifier 'menu_order' is not in camel case camelcase + 92:6 error Identifier 'menu_order' is not in camel case camelcase + 98:6 error Identifier 'menu_order' is not in camel case camelcase + 106:6 error Identifier 'menu_order' is not in camel case camelcase + 113:6 error Identifier 'menu_order' is not in camel case camelcase + 119:1 error Line 119 exceeds the maximum line length of 100 max-len + 123:6 error Identifier 'menu_order' is not in camel case camelcase + 128:6 error Identifier 'menu_order' is not in camel case camelcase + 135:6 error Identifier 'menu_order' is not in camel case camelcase + 142:6 error Identifier 'menu_order' is not in camel case camelcase + 154:6 error Identifier 'menu_order' is not in camel case camelcase + 160:6 error Identifier 'menu_order' is not in camel case camelcase + 167:6 error Identifier 'menu_order' is not in camel case camelcase + 175:6 error Identifier 'menu_order' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/my-sites/people/controller.js + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 93:1 error Line 93 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/people/index.js + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/plugins/controller.js + 219:1 error Line 219 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/plugins/index.js + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/plugins/plugin-activate-toggle/test/mocks/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/plugins/plugin-autoupdate-toggle/test/fixtures/index.js + 8:14 error Identifier 'file_mod_disabled' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/my-sites/plugins/plugin-autoupdate-toggle/test/mocks/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/plugins/plugins-browser/wpcom-features-as-plugins.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 174:1 error Line 174 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/plugins/plugins-list/test/fixtures/index.js + 9:3 error Identifier 'post_count' is not in camel case camelcase + 10:3 error Identifier 'subscribers_count' is not in camel case camelcase + 13:3 error Identifier 'is_private' is not in camel case camelcase + 14:3 error Identifier 'is_following' is not in camel case camelcase + 17:4 error Identifier 'gmt_offset' is not in camel case camelcase + 18:4 error Identifier 'videopress_enabled' is not in camel case camelcase + 19:4 error Identifier 'login_url' is not in camel case camelcase + 20:4 error Identifier 'admin_url' is not in camel case camelcase + 21:4 error Identifier 'featured_images_enabled' is not in camel case camelcase + 22:4 error Identifier 'header_image' is not in camel case camelcase + 23:4 error Identifier 'image_default_link_type' is not in camel case camelcase + 24:4 error Identifier 'image_thumbnail_width' is not in camel case camelcase + 25:4 error Identifier 'image_thumbnail_height' is not in camel case camelcase + 26:4 error Identifier 'image_thumbnail_crop' is not in camel case camelcase + 27:4 error Identifier 'image_medium_width' is not in camel case camelcase + 28:4 error Identifier 'image_medium_height' is not in camel case camelcase + 29:4 error Identifier 'image_large_width' is not in camel case camelcase + 30:4 error Identifier 'image_large_height' is not in camel case camelcase + 31:4 error Identifier 'post_formats' is not in camel case camelcase + 39:4 error Identifier 'default_likes_enabled' is not in camel case camelcase + 40:4 error Identifier 'default_sharing_status' is not in camel case camelcase + 41:4 error Identifier 'default_comment_status' is not in camel case camelcase + 42:4 error Identifier 'default_ping_status' is not in camel case camelcase + 43:4 error Identifier 'software_version' is not in camel case camelcase + 54:3 error Identifier 'user_can_manage' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/my-sites/posts/controller.js + 32:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/my-sites/preview/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/sharing/buttons/preview-widget.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Unexpected var, use let or const instead no-var + 14:3 error Unexpected var, use let or const instead no-var + 20:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/my-sites/sharing/connections/services/eventbrite.js + 42:53 error Identifier 'eventbrite_api_token' is not in camel case camelcase + 69:6 error Identifier 'eventbrite_api_token' is not in camel case camelcase + 95:5 error Identifier 'keyring_connection_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/my-sites/sharing/connections/services/google-photos.js + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 96:5 error Identifier 'keyring_connection_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/my-sites/sharing/connections/services/index.js + 4:8 error Identifier 'google_photos' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/my-sites/sharing/connections/services/instagram.js + 79:5 error Identifier 'keyring_connection_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/my-sites/sharing/controller.js + 21:1 error 'lib/sites-list' import is restricted from being used no-restricted-imports + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/site-settings/date-time-format/test/index.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/site-settings/date-time-format/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 133:1 error Line 133 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/stats/activity-log/utils.js + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/stats/index.js + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/stats/stats-strings.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + 113:1 error Line 113 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/theme/index.node.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/theme/index.web.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/theme/theme-features-card.js + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 47:63 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + +/Users/seear/repos/wp-calypso/client/my-sites/themes/helpers.js + 36:47 error Identifier 'site_id' is not in camel case camelcase + 44:7 error Identifier 'site_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/my-sites/themes/index.node.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/themes/index.web.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/my-sites/themes/theme-options.js + 41:1 error Expected indentation of 2 tabs but found 3 indent + 42:1 error Expected indentation of 3 tabs but found 4 indent + 43:1 error Expected indentation of 2 tabs but found 3 indent + 44:1 error Expected indentation of 2 tabs but found 3 indent + 45:1 error Expected indentation of 2 tabs but found 3 indent + 46:1 error Expected indentation of 3 tabs but found 4 indent + 47:1 error Expected indentation of 3 tabs but found 4 indent + 48:1 error Expected indentation of 2 tabs but found 3 indent + 49:1 error Expected indentation of 2 tabs but found 3 indent + 50:1 error Expected indentation of 2 tabs but found 3 indent + 51:1 error Expected indentation of 3 tabs but found 4 indent + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + 56:1 error Expected indentation of 1 tab but found 2 indent + 61:1 error Expected indentation of 2 tabs but found 3 indent + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 62:1 error Expected indentation of 3 tabs but found 4 indent + 63:1 error Expected indentation of 2 tabs but found 3 indent + 64:1 error Expected indentation of 2 tabs but found 3 indent + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + 65:1 error Expected indentation of 3 tabs but found 4 indent + 66:1 error Expected indentation of 2 tabs but found 3 indent + 67:1 error Expected indentation of 2 tabs but found 3 indent + 68:1 error Expected indentation of 3 tabs but found 4 indent + 69:1 error Expected indentation of 3 tabs but found 4 indent + 70:1 error Expected indentation of 2 tabs but found 3 indent + 71:1 error Expected indentation of 2 tabs but found 3 indent + 72:1 error Expected indentation of 3 tabs but found 4 indent + 73:1 error Expected indentation of 2 tabs but found 3 indent + 74:1 error Expected indentation of 3 tabs but found 4 indent + 79:1 error Expected indentation of 1 tab but found 2 indent + 93:1 error Line 93 exceeds the maximum line length of 100 max-len + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + 136:1 error Line 136 exceeds the maximum line length of 100 max-len + 202:16 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + 202:26 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + 203:22 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + 203:38 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + 205:16 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + 205:26 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + 206:22 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + 206:38 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + 209:40 error Don't instantiate functions within `connect`. See wp-calypso#14024 wpcalypso/redux-no-bound-selectors + +/Users/seear/repos/wp-calypso/client/my-sites/themes/themes-magic-search-card/taxonomies-config.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/my-sites/types/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/notices/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:1 error Unexpected var, use let or const instead no-var + 16:1 error Unexpected var, use let or const instead no-var + 19:2 error Missing JSDoc for parameter 'text' valid-jsdoc + 19:2 error Missing JSDoc for parameter 'options' valid-jsdoc + 19:2 error Missing JSDoc for parameter 'status' valid-jsdoc + 25:2 error Unquoted reserved word 'new' used as key quote-props + 27:3 error Unexpected var, use let or const instead no-var + 35:3 error Unexpected var, use let or const instead no-var + 68:2 error Missing JSDoc for parameter 'text' valid-jsdoc + 68:2 error Missing JSDoc for parameter 'options' valid-jsdoc + 79:2 error Missing JSDoc for parameter 'text' valid-jsdoc + 79:2 error Missing JSDoc for parameter 'options' valid-jsdoc + 90:2 error Missing JSDoc for parameter 'text' valid-jsdoc + 90:2 error Missing JSDoc for parameter 'options' valid-jsdoc + 101:2 error Missing JSDoc for parameter 'text' valid-jsdoc + 101:2 error Missing JSDoc for parameter 'options' valid-jsdoc + 125:3 error Unexpected var, use let or const instead no-var + 135:2 error Missing JSDoc for parameter 'context' valid-jsdoc + 135:2 error Missing JSDoc for parameter 'next' valid-jsdoc + 141:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/post-editor/controller.js + 129:1 error Line 129 exceeds the maximum line length of 100 max-len + 131:1 error Line 131 exceeds the maximum line length of 100 max-len + 153:19 error Identifier 'featured_image' is not in camel case camelcase + 187:1 error Line 187 exceeds the maximum line length of 100 max-len + 242:1 error Line 242 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/post-editor/editor-sidebar/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/post-editor/media-modal/markup.js + 22:1 error Unexpected var, use let or const instead no-var + 35:3 error Unexpected var, use let or const instead no-var + 60:3 error Unexpected var, use let or const instead no-var + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + 87:3 error Unexpected var, use let or const instead no-var + 119:9 error className should follow CSS namespace guidelines (expected media-modal__ prefix) wpcalypso/jsx-classname-namespace + 120:9 error className should follow CSS namespace guidelines (expected media-modal__ prefix) wpcalypso/jsx-classname-namespace + 162:1 error Line 162 exceeds the maximum line length of 100 max-len + 178:1 error Line 178 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/post-editor/media-modal/preload-image.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/post-editor/media-modal/test/markup.js + 35:4 error Unexpected var, use let or const instead no-var + 42:24 error Identifier 'mime_type' is not in camel case camelcase + 49:24 error Identifier 'mime_type' is not in camel case camelcase + 57:4 error Unexpected var, use let or const instead no-var + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 70:4 error Unexpected var, use let or const instead no-var + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 86:4 error Unexpected var, use let or const instead no-var + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 98:4 error Unexpected var, use let or const instead no-var + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 113:5 error Unexpected var, use let or const instead no-var + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 125:5 error Unexpected var, use let or const instead no-var + 127:1 error Line 127 exceeds the maximum line length of 100 max-len + 134:1 error Line 134 exceeds the maximum line length of 100 max-len + 141:7 error Identifier 'image_large_width' is not in camel case camelcase + 142:7 error Identifier 'image_large_height' is not in camel case camelcase + 159:1 error Line 159 exceeds the maximum line length of 100 max-len + 166:7 error Identifier 'image_large_width' is not in camel case camelcase + 167:7 error Identifier 'image_large_height' is not in camel case camelcase + 184:1 error Line 184 exceeds the maximum line length of 100 max-len + 189:5 error Unexpected var, use let or const instead no-var + 194:1 error Line 194 exceeds the maximum line length of 100 max-len + 203:1 error Line 203 exceeds the maximum line length of 100 max-len + 208:5 error Unexpected var, use let or const instead no-var + 216:1 error Line 216 exceeds the maximum line length of 100 max-len + 220:1 error Line 220 exceeds the maximum line length of 100 max-len + 221:5 error Unexpected var, use let or const instead no-var + 224:7 error Identifier 'image_large_width' is not in camel case camelcase + 233:1 error Line 233 exceeds the maximum line length of 100 max-len + 242:1 error Line 242 exceeds the maximum line length of 100 max-len + 246:1 error Line 246 exceeds the maximum line length of 100 max-len + 247:5 error Unexpected var, use let or const instead no-var + 257:1 error Line 257 exceeds the maximum line length of 100 max-len + 265:1 error Line 265 exceeds the maximum line length of 100 max-len + 270:5 error Unexpected var, use let or const instead no-var + 272:1 error Line 272 exceeds the maximum line length of 100 max-len + 280:1 error Line 280 exceeds the maximum line length of 100 max-len + 285:5 error Unexpected var, use let or const instead no-var + 290:1 error Line 290 exceeds the maximum line length of 100 max-len + 300:1 error Line 300 exceeds the maximum line length of 100 max-len + 304:1 error Line 304 exceeds the maximum line length of 100 max-len + 307:1 error Line 307 exceeds the maximum line length of 100 max-len + 312:6 error Unquoted reserved word 'transient' used as key quote-props + 316:1 error Line 316 exceeds the maximum line length of 100 max-len + 320:1 error Line 320 exceeds the maximum line length of 100 max-len + 323:1 error Line 323 exceeds the maximum line length of 100 max-len + 328:6 error Unquoted reserved word 'transient' used as key quote-props + 332:1 error Line 332 exceeds the maximum line length of 100 max-len + 339:5 error Unexpected var, use let or const instead no-var + 351:5 error Unexpected var, use let or const instead no-var + 352:6 error Identifier 'videopress_guid' is not in camel case camelcase + 359:5 error Unexpected var, use let or const instead no-var + 366:1 error Line 366 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/post-editor/media-modal/test/preload-image.js + 30:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/reader/controller-helper.js + 59:3 error Identifier 'newdash_pageviews' is not in camel case camelcase + 60:3 error Identifier 'reader_views' is not in camel case camelcase + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/reader/controller.js + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + 89:1 error Line 89 exceeds the maximum line length of 100 max-len + 201:4 error Identifier 'feed_id' is not in camel case camelcase + 210:5 error JSX props should not use .bind() react/jsx-no-bind + 217:5 error JSX props should not use .bind() react/jsx-no-bind + 237:4 error Identifier 'blog_id' is not in camel case camelcase + 246:5 error JSX props should not use .bind() react/jsx-no-bind + 253:5 error JSX props should not use .bind() react/jsx-no-bind + 279:5 error className should follow CSS namespace guidelines (expected reader__ prefix) wpcalypso/jsx-classname-namespace + 282:5 error JSX props should not use .bind() react/jsx-no-bind + 290:5 error JSX props should not use .bind() react/jsx-no-bind + +/Users/seear/repos/wp-calypso/client/reader/conversations/controller.js + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/reader/discover/controller.js + 48:5 error JSX props should not use .bind() react/jsx-no-bind + 55:5 error JSX props should not use .bind() react/jsx-no-bind + 60:5 error className should follow CSS namespace guidelines (expected discover__ prefix) wpcalypso/jsx-classname-namespace + +/Users/seear/repos/wp-calypso/client/reader/discover/stats.js + 5:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:67 error Identifier 'author_url' is not in camel case camelcase + 16:65 error Identifier 'site_url' is not in camel case camelcase + 25:59 error Identifier 'site_url' is not in camel case camelcase + 29:61 error Identifier 'site_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/reader/discover/test/fixtures/index.js + 11:2 error Identifier 'site_ID' is not in camel case camelcase + 14:2 error Identifier 'site_ID' is not in camel case camelcase + 15:2 error Identifier 'discover_metadata' is not in camel case camelcase + 18:4 error Identifier 'author_name' is not in camel case camelcase + 19:4 error Identifier 'author_url' is not in camel case camelcase + 20:4 error Identifier 'blog_name' is not in camel case camelcase + 21:4 error Identifier 'blog_url' is not in camel case camelcase + 22:4 error Identifier 'avatar_url' is not in camel case camelcase + 24:3 error Identifier 'discover_fp_post_formats' is not in camel case camelcase + 36:3 error Identifier 'featured_post_wpcom_data' is not in camel case camelcase + 37:4 error Identifier 'blog_id' is not in camel case camelcase + 43:2 error Identifier 'site_ID' is not in camel case camelcase + 44:2 error Identifier 'discover_metadata' is not in camel case camelcase + 47:4 error Identifier 'author_name' is not in camel case camelcase + 48:4 error Identifier 'author_url' is not in camel case camelcase + 49:4 error Identifier 'blog_name' is not in camel case camelcase + 50:4 error Identifier 'blog_url' is not in camel case camelcase + 51:4 error Identifier 'avatar_url' is not in camel case camelcase + 54:3 error Identifier 'discover_fp_post_formats' is not in camel case camelcase + 66:3 error Identifier 'featured_post_wpcom_data' is not in camel case camelcase + 67:4 error Identifier 'blog_id' is not in camel case camelcase + 68:4 error Identifier 'post_id' is not in camel case camelcase + 69:4 error Identifier 'like_count' is not in camel case camelcase + 70:4 error Identifier 'comment_count' is not in camel case camelcase + 76:32 error Identifier 'featured_post_wpcom_data' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/reader/discover/test/helper.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 134:1 error Line 134 exceeds the maximum line length of 100 max-len + 141:1 error Line 141 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/reader/get-helpers.js + 8:1 error 'i18n-calypso' import is duplicated no-duplicate-imports + +/Users/seear/repos/wp-calypso/client/reader/list/controller.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + 35:4 error Identifier 'list_owner' is not in camel case camelcase + 36:4 error Identifier 'list_slug' is not in camel case camelcase + 47:5 error JSX props should not use .bind() react/jsx-no-bind + 54:5 error JSX props should not use .bind() react/jsx-no-bind + +/Users/seear/repos/wp-calypso/client/reader/route/test/index.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 16:42 error Identifier 'feed_ID' is not in camel case camelcase + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 20:42 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/reader/search/controller.js + 79:5 error JSX props should not use .bind() react/jsx-no-bind + 86:5 error JSX props should not use .bind() react/jsx-no-bind + +/Users/seear/repos/wp-calypso/client/reader/stats.js + 27:3 error Identifier 'reader_actions' is not in camel case camelcase + 28:3 error Identifier 'reader_permalink_source' is not in camel case camelcase + 113:37 error Identifier 'ui_algo' is not in camel case camelcase + 116:38 error Identifier 'subscription_count' is not in camel case camelcase + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 173:5 error Identifier 'blog_id' is not in camel case camelcase + 174:5 error Identifier 'post_id' is not in camel case camelcase + 175:5 error Identifier 'feed_id' is not in camel case camelcase + 176:5 error Identifier 'feed_item_id' is not in camel case camelcase + 177:5 error Identifier 'is_jetpack' is not in camel case camelcase + 191:1 error Line 191 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/reader/stream/test/utils.js + 83:1 error Line 83 exceeds the maximum line length of 100 max-len + 150:1 error Line 150 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/reader/stream/utils.js + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/reader/tag-stream/controller.js + 50:4 error JSX props should not use .bind() react/jsx-no-bind + +/Users/seear/repos/wp-calypso/client/reader/test/get-helpers.js + 15:28 error Identifier 'feed_URL' is not in camel case camelcase + 16:28 error Identifier 'site_URL' is not in camel case camelcase + 62:26 error Identifier 'is_error' is not in camel case camelcase + 65:29 error Identifier 'site_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/reader/utils.js + 55:4 error Identifier 'feed_ID' is not in camel case camelcase + 56:4 error Identifier 'feed_item_ID' is not in camel case camelcase + 60:4 error Identifier 'site_ID' is not in camel case camelcase + 75:4 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/reader/xpost-helper.js + 19:7 error 'xPostMetadata' is never reassigned. Use 'const' instead prefer-const + 34:10 error 'parsedURL' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/sections-preload.js + 6:1 error Line 6 exceeds the maximum line length of 100 max-len + 7:1 error Line 7 exceeds the maximum line length of 100 max-len + 8:1 error Line 8 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/signup/config/flows.js + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 248:1 error Line 248 exceeds the maximum line length of 100 max-len + 263:1 error Line 263 exceeds the maximum line length of 100 max-len + 335:1 error Line 335 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/signup/config/step-components.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/signup/config/steps.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/signup/config/test/index.js + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/signup/index.node.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:18 error 'stepName' is never reassigned. Use 'const' instead prefer-const + +/Users/seear/repos/wp-calypso/client/signup/steps/survey/verticals.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/signup/steps/user/test/index.js + 101:1 error Line 101 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/signup/test/utils.js + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 111:1 error Line 111 exceeds the maximum line length of 100 max-len + 225:1 error Line 225 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/signup/utils.js + 15:1 error 'signup/config/flows' import is duplicated no-duplicate-imports + +/Users/seear/repos/wp-calypso/client/state/account-recovery/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/account-recovery/reset/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/account-recovery/reset/test/reducer.js + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + 160:1 error Line 160 exceeds the maximum line length of 100 max-len + 168:1 error Line 168 exceeds the maximum line length of 100 max-len + 196:1 error Line 196 exceeds the maximum line length of 100 max-len + 210:1 error Line 210 exceeds the maximum line length of 100 max-len + 218:1 error Line 218 exceeds the maximum line length of 100 max-len + 227:1 error Line 227 exceeds the maximum line length of 100 max-len + 242:1 error Line 242 exceeds the maximum line length of 100 max-len + 250:1 error Line 250 exceeds the maximum line length of 100 max-len + 258:1 error Line 258 exceeds the maximum line length of 100 max-len + 272:1 error Line 272 exceeds the maximum line length of 100 max-len + 280:1 error Line 280 exceeds the maximum line length of 100 max-len + 289:1 error Line 289 exceeds the maximum line length of 100 max-len + 303:1 error Line 303 exceeds the maximum line length of 100 max-len + 312:1 error Line 312 exceeds the maximum line length of 100 max-len + 320:1 error Line 320 exceeds the maximum line length of 100 max-len + 350:1 error Line 350 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/account-recovery/selectors.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'state' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/account-recovery/settings/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/account-recovery/settings/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 58:10 error Identifier 'country_code' is not in camel case camelcase + 58:24 error Identifier 'country_numeric_code' is not in camel case camelcase + 58:54 error Identifier 'number_full' is not in camel case camelcase + 61:16 error Identifier 'country_code' is not in camel case camelcase + 62:23 error Identifier 'country_numeric_code' is not in camel case camelcase + 64:15 error Identifier 'number_full' is not in camel case camelcase + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + 112:1 error Line 112 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/account-recovery/settings/selectors.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'state' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/account-recovery/settings/test/actions.js + 161:1 error Line 161 exceeds the maximum line length of 100 max-len + 364:1 error Line 364 exceeds the maximum line length of 100 max-len + 374:1 error Line 374 exceeds the maximum line length of 100 max-len + 420:1 error Line 420 exceeds the maximum line length of 100 max-len + 430:1 error Line 430 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/account-recovery/settings/test/reducer.js + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 129:1 error Line 129 exceeds the maximum line length of 100 max-len + 138:1 error Line 138 exceeds the maximum line length of 100 max-len + 156:1 error Line 156 exceeds the maximum line length of 100 max-len + 165:1 error Line 165 exceeds the maximum line length of 100 max-len + 174:1 error Line 174 exceeds the maximum line length of 100 max-len + 183:1 error Line 183 exceeds the maximum line length of 100 max-len + 191:1 error Line 191 exceeds the maximum line length of 100 max-len + 199:1 error Line 199 exceeds the maximum line length of 100 max-len + 207:1 error Line 207 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/account-recovery/settings/test/selectors.js + 317:1 error Line 317 exceeds the maximum line length of 100 max-len + 321:1 error Line 321 exceeds the maximum line length of 100 max-len + 325:1 error Line 325 exceeds the maximum line length of 100 max-len + 355:1 error Line 355 exceeds the maximum line length of 100 max-len + 359:1 error Line 359 exceeds the maximum line length of 100 max-len + 363:1 error Line 363 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/account-recovery/settings/test/test-data/index.js + 4:2 error Identifier 'email_validated' is not in camel case camelcase + 6:3 error Identifier 'country_code' is not in camel case camelcase + 7:3 error Identifier 'country_numeric_code' is not in camel case camelcase + 9:3 error Identifier 'number_full' is not in camel case camelcase + 11:2 error Identifier 'phone_validated' is not in camel case camelcase + 15:2 error Identifier 'country_code' is not in camel case camelcase + 16:2 error Identifier 'country_numeric_code' is not in camel case camelcase + 18:2 error Identifier 'number_full' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/account-recovery/settings/test/utils/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/account-recovery/test/reducer.js + 32:5 error Identifier 'email_validated' is not in camel case camelcase + 34:5 error Identifier 'phone_validated' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/action-watchers/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/activity-log/activation/test/reducer.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/activity-log/log/is-discarded/index.js + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/activity-log/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/activity-log/restore/test/reducer.js + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/activity-log/rewind-status/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/analytics/actions.js + 29:1 error Expected indentation of 3 tabs but found 4 indent + 30:1 error Expected indentation of 3 tabs but found 4 indent + 31:1 error Expected indentation of 2 tabs but found 3 indent + +/Users/seear/repos/wp-calypso/client/state/analytics/middleware.js + 36:2 error Unquoted reserved word 'default' used as key quote-props + +/Users/seear/repos/wp-calypso/client/state/analytics/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/analytics/test/helpers/analytics-mock.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/analytics/test/middleware.js + 81:3 error Test title is used multiple times in the same test suite jest/no-identical-title + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/application/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/application/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/application/test/actions.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/application/test/reducer.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/audio/middleware.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/automated-transfer/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/automated-transfer/middleware.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 17:16 error 'lib/sites-list' module is restricted from being used no-restricted-modules + 23:16 error 'lib/sites-list' module is restricted from being used no-restricted-modules + +/Users/seear/repos/wp-calypso/client/state/automated-transfer/schema.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/automated-transfer/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/automated-transfer/test/reducer.js + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/billing-transactions/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 28:15 error Identifier 'billing_history' is not in camel case camelcase + 28:32 error Identifier 'upcoming_charges' is not in camel case camelcase + 31:12 error Identifier 'billing_history' is not in camel case camelcase + 32:16 error Identifier 'upcoming_charges' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/billing-transactions/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/billing-transactions/schema.js + 20:6 error Identifier 'pay_ref' is not in camel case camelcase + 21:6 error Identifier 'pay_part' is not in camel case camelcase + 22:6 error Identifier 'cc_type' is not in camel case camelcase + 23:6 error Identifier 'cc_num' is not in camel case camelcase + 24:6 error Identifier 'cc_name' is not in camel case camelcase + 25:6 error Identifier 'cc_email' is not in camel case camelcase + 42:6 error Identifier 'blog_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/billing-transactions/test/actions.js + 31:5 error Identifier 'billing_history' is not in camel case camelcase + 38:5 error Identifier 'upcoming_charges' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/billing-transactions/test/reducer.js + 186:1 error Line 186 exceeds the maximum line length of 100 max-len + 198:1 error Line 198 exceeds the maximum line length of 100 max-len + 210:1 error Line 210 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/billing-transactions/util.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/comments/actions.js + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/comments/from-api.js + 7:29 error Identifier 'avatar_URL' is not in camel case camelcase + 17:3 error Identifier 'avatar_URL' is not in camel case camelcase + 17:27 error Identifier 'avatar_URL' is not in camel case camelcase + 27:4 error Identifier 'avatar_URL' is not in camel case camelcase + 28:4 error Identifier 'display_name' is not in camel case camelcase + 30:4 error Identifier 'primary_blog' is not in camel case camelcase + 31:4 error Identifier 'primary_blog_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/comments/reducer.js + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 67:1 error Expected indentation of 3 tabs but found 4 indent + 68:1 error Expected indentation of 3 tabs but found 4 indent + 69:1 error Expected indentation of 4 tabs but found 5 indent + 70:1 error Expected indentation of 4 tabs but found 5 indent + 71:1 error Expected indentation of 4 tabs but found 5 indent + 72:1 error Expected indentation of 3 tabs but found 4 indent + 73:1 error Expected indentation of 3 tabs but found 4 indent + 74:1 error Expected indentation of 2 tabs but found 3 indent + 80:4 error Identifier 'like_count' is not in camel case camelcase + 92:43 error Identifier 'like_count' is not in camel case camelcase + 123:1 error Line 123 exceeds the maximum line length of 100 max-len + 135:34 error Identifier 'i_like' is not in camel case camelcase + 135:48 error Identifier 'like_count' is not in camel case camelcase + 135:48 error Identifier 'like_count' is not in camel case camelcase + 143:34 error Identifier 'i_like' is not in camel case camelcase + 143:49 error Identifier 'like_count' is not in camel case camelcase + 143:49 error Identifier 'like_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/comments/selectors.js + 188:10 error Identifier 'i_like' is not in camel case camelcase + 188:18 error Identifier 'like_count' is not in camel case camelcase + 189:11 error Identifier 'i_like' is not in camel case camelcase + 189:11 error Identifier 'i_like' is not in camel case camelcase + 189:19 error Identifier 'like_count' is not in camel case camelcase + 189:19 error Identifier 'like_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/comments/test/actions.js + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/comments/test/reducer.js + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 90:25 error Identifier 'like_count' is not in camel case camelcase + 90:42 error Identifier 'i_like' is not in camel case camelcase + 106:25 error Identifier 'like_count' is not in camel case camelcase + 106:42 error Identifier 'i_like' is not in camel case camelcase + 412:1 error Line 412 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/comments/test/selectors.js + 20:6 error Identifier 'i_like' is not in camel case camelcase + 22:6 error Identifier 'like_count' is not in camel case camelcase + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 24:64 error Identifier 'i_like' is not in camel case camelcase + 24:78 error Identifier 'like_count' is not in camel case camelcase + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 25:64 error Identifier 'i_like' is not in camel case camelcase + 25:79 error Identifier 'like_count' is not in camel case camelcase + 30:6 error Identifier 'i_like' is not in camel case camelcase + 32:6 error Identifier 'like_count' is not in camel case camelcase + 47:6 error Identifier 'i_like' is not in camel case camelcase + 48:6 error Identifier 'like_count' is not in camel case camelcase + 54:6 error Identifier 'i_like' is not in camel case camelcase + 55:6 error Identifier 'like_count' is not in camel case camelcase + 61:6 error Identifier 'i_like' is not in camel case camelcase + 62:6 error Identifier 'like_count' is not in camel case camelcase + 68:6 error Identifier 'i_like' is not in camel case camelcase + 69:6 error Identifier 'like_count' is not in camel case camelcase + 75:6 error Identifier 'i_like' is not in camel case camelcase + 76:6 error Identifier 'like_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/comments/trees/reducer.js + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/components-usage-stats/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/components-usage-stats/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/components-usage-stats/test/reducer.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/country-states/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/country-states/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/country-states/test/actions.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/current-user/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/current-user/email-verification/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/current-user/email-verification/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/current-user/email-verification/test/reducer.js + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/current-user/gravatar-status/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/current-user/gravatar-status/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/current-user/gravatar-status/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/current-user/gravatar-status/test/selectors.js + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/current-user/schema.js + 18:5 error Identifier 'edit_pages' is not in camel case camelcase + 19:5 error Identifier 'edit_posts' is not in camel case camelcase + 20:5 error Identifier 'edit_others_posts' is not in camel case camelcase + 21:5 error Identifier 'edit_others_pages' is not in camel case camelcase + 22:5 error Identifier 'delete_posts' is not in camel case camelcase + 23:5 error Identifier 'delete_others_posts' is not in camel case camelcase + 24:5 error Identifier 'edit_theme_options' is not in camel case camelcase + 25:5 error Identifier 'edit_users' is not in camel case camelcase + 26:5 error Identifier 'list_users' is not in camel case camelcase + 27:5 error Identifier 'manage_categories' is not in camel case camelcase + 28:5 error Identifier 'manage_options' is not in camel case camelcase + 29:5 error Identifier 'promote_users' is not in camel case camelcase + 30:5 error Identifier 'publish_posts' is not in camel case camelcase + 31:5 error Identifier 'upload_files' is not in camel case camelcase + 32:5 error Identifier 'delete_users' is not in camel case camelcase + 33:5 error Identifier 'remove_users' is not in camel case camelcase + 34:5 error Identifier 'view_stats' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/current-user/test/reducer.js + 102:7 error Identifier 'product_id' is not in camel case camelcase + 103:7 error Identifier 'currency_code' is not in camel case camelcase + 121:7 error Identifier 'product_id' is not in camel case camelcase + 122:7 error Identifier 'currency_code' is not in camel case camelcase + 194:7 error Identifier 'manage_options' is not in camel case camelcase + 201:6 error Identifier 'manage_options' is not in camel case camelcase + 209:6 error Identifier 'manage_options' is not in camel case camelcase + 217:7 error Identifier 'manage_options' is not in camel case camelcase + 224:6 error Identifier 'manage_options' is not in camel case camelcase + 227:6 error Identifier 'manage_options' is not in camel case camelcase + 250:8 error Identifier 'manage_options' is not in camel case camelcase + 258:6 error Identifier 'manage_options' is not in camel case camelcase + 279:6 error Identifier 'manage_options' is not in camel case camelcase + 288:8 error Identifier 'manage_options' is not in camel case camelcase + 305:8 error Identifier 'manage_options' is not in camel case camelcase + 317:6 error Identifier 'manage_options' is not in camel case camelcase + 326:8 error Identifier 'manage_options' is not in camel case camelcase + 334:6 error Identifier 'manage_options' is not in camel case camelcase + 342:6 error Identifier 'manage_options' is not in camel case camelcase + 355:6 error Identifier 'manage_options' is not in camel case camelcase + 368:6 error Identifier 'manage_options' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/current-user/test/selectors.js + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + 171:9 error Identifier 'manage_options' is not in camel case camelcase + 189:9 error Identifier 'manage_options' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/extensions-middleware.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 64:1 error Missing JSDoc @returns for function valid-jsdoc + 64:1 error Missing JSDoc for parameter 'store' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/data-layer/test/extensions-middleware.js + 232:1 error Line 232 exceeds the maximum line length of 100 max-len + 240:1 error Line 240 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/test/wpcom-api-middleware.js + 180:1 error Line 180 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/third-party/directly/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/third-party/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/third-party/refer/index.js + 36:6 error Identifier 'affiliate_id' is not in camel case camelcase + 47:43 error 'dispatch' is defined but never used no-unused-vars + +/Users/seear/repos/wp-calypso/client/state/data-layer/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-api-middleware.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-http/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-http/index.js + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 76:1 error Expected indentation of 6 tabs but found 7 indent + 77:1 error Expected indentation of 5 tabs but found 6 indent + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + 79:1 error Expected indentation of 6 tabs but found 7 indent + 80:1 error Expected indentation of 5 tabs but found 6 indent + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-http/pipeline/remove-duplicate-gets/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-http/pipeline/remove-duplicate-gets/test/index.js + 99:1 error Line 99 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-http/pipeline/retry-on-failure/policies.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-http/pipeline/retry-on-failure/test/index.js + 34:1 error Expected indentation of 3 tabs but found 4 indent + 35:1 error Expected indentation of 2 tabs but found 3 indent + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + 158:1 error Line 158 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-http/pipeline/test/test.js + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-http/test/index.js + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-http/test/utils.js + 187:31 error Identifier 'is_active' is not in camel case camelcase + 204:31 error Identifier 'is_active' is not in camel case camelcase + 222:31 error Identifier 'is_active' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom-http/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 40:1 error Missing JSDoc return description valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/account-recovery/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/account-recovery/lookup/index.js + 33:29 error Identifier 'primary_email' is not in camel case camelcase + 33:44 error Identifier 'primary_sms' is not in camel case camelcase + 33:57 error Identifier 'secondary_email' is not in camel case camelcase + 33:74 error Identifier 'secondary_sms' is not in camel case camelcase + 34:11 error Identifier 'primary_email' is not in camel case camelcase + 34:26 error Identifier 'primary_sms' is not in camel case camelcase + 34:39 error Identifier 'secondary_email' is not in camel case camelcase + 34:56 error Identifier 'secondary_sms' is not in camel case camelcase + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/account-recovery/lookup/test/index.js + 20:2 error Identifier 'primary_email' is not in camel case camelcase + 21:2 error Identifier 'secondary_email' is not in camel case camelcase + 22:2 error Identifier 'primary_sms' is not in camel case camelcase + 23:2 error Identifier 'secondary_sms' is not in camel case camelcase + 35:6 error Identifier 'primary_email' is not in camel case camelcase + 45:6 error Identifier 'primary_email' is not in camel case camelcase + 46:6 error Identifier 'primary_sms' is not in camel case camelcase + 47:6 error Identifier 'secondary_email' is not in camel case camelcase + 48:6 error Identifier 'secondary_sms' is not in camel case camelcase + 119:5 error Identifier 'primary_email' is not in camel case camelcase + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/account-recovery/request-reset/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/account-recovery/reset/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/account-recovery/validate/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/activity-log/deactivate/index.js + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/activity-log/get-credentials/index.js + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/activity-log/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/activity-log/rewind/restore-status/index.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 34:21 error Identifier 'restore_status' is not in camel case camelcase + 36:3 error Identifier 'error_code' is not in camel case camelcase + 37:3 error Identifier 'failure_reason' is not in camel case camelcase + 41:6 error Identifier 'restore_status' is not in camel case camelcase + 44:14 error Identifier 'error_code' is not in camel case camelcase + 45:18 error Identifier 'failure_reason' is not in camel case camelcase + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/activity-log/rewind/restore-status/test/index.js + 22:2 error Identifier 'restore_status' is not in camel case camelcase + 23:3 error Identifier 'error_code' is not in camel case camelcase + 24:3 error Identifier 'failure_reason' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/activity-log/rewind/test/index.js + 20:2 error Identifier 'site_id' is not in camel case camelcase + 22:2 error Identifier 'site_url' is not in camel case camelcase + 23:2 error Identifier 'is_active' is not in camel case camelcase + 24:2 error Identifier 'is_plugin_active' is not in camel case camelcase + 25:2 error Identifier 'number_of_backups' is not in camel case camelcase + 26:2 error Identifier 'first_backup_when' is not in camel case camelcase + 27:2 error Identifier 'last_backup_when' is not in camel case camelcase + 28:2 error Identifier 'is_pressable' is not in camel case camelcase + 29:2 error Identifier 'use_rewind' is not in camel case camelcase + 30:2 error Identifier 'recent_backups' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/activity-log/rewind/to/index.js + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/activity-log/rewind/to/test/index.js + 22:2 error Identifier 'restore_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/activity-log/update-credentials/index.js + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/comments/index.js + 191:1 error Line 191 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/comments/test/index.js + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 128:1 error Line 128 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/gravatar-upload/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/login-2fa/index.js + 50:6 error Identifier 'user_id' is not in camel case camelcase + 51:6 error Identifier 'auth_type' is not in camel case camelcase + 52:6 error Identifier 'two_step_nonce' is not in camel case camelcase + 53:6 error Identifier 'remember_me' is not in camel case camelcase + 54:6 error Identifier 'two_step_push_token' is not in camel case camelcase + 55:6 error Identifier 'client_id' is not in camel case camelcase + 56:6 error Identifier 'client_secret' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/me/devices/index.js + 21:20 error Identifier 'device_id' is not in camel case camelcase + 21:31 error Identifier 'device_name' is not in camel case camelcase + 21:58 error Identifier 'device_id' is not in camel case camelcase + 21:75 error Identifier 'device_name' is not in camel case camelcase + 25:1 error Missing JSDoc for parameter 'action' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/me/devices/test/index.js + 38:8 error Identifier 'device_id' is not in camel case camelcase + 38:22 error Identifier 'device_name' is not in camel case camelcase + 39:8 error Identifier 'device_id' is not in camel case camelcase + 39:22 error Identifier 'device_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/me/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/me/notification/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/me/send-verification-email/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/me/settings/index.js + 25:3 error Identifier 'display_name' is not in camel case camelcase + 27:3 error Identifier 'user_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/me/settings/test/index.js + 65:6 error Identifier 'display_name' is not in camel case camelcase + 67:6 error Identifier 'user_URL' is not in camel case camelcase + 72:7 error Identifier 'display_name' is not in camel case camelcase + 74:7 error Identifier 'user_URL' is not in camel case camelcase + 83:1 error Line 83 exceeds the maximum line length of 100 max-len + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + 147:1 error Line 147 exceeds the maximum line length of 100 max-len + 163:1 error Line 163 exceeds the maximum line length of 100 max-len + 177:1 error Line 177 exceeds the maximum line length of 100 max-len + 184:6 error Identifier 'display_name' is not in camel case camelcase + 186:6 error Identifier 'user_URL' is not in camel case camelcase + 191:7 error Identifier 'display_name' is not in camel case camelcase + 193:7 error Identifier 'user_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/plans/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/posts/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/posts/revisions/test/index.js + 26:3 error Identifier 'date_gmt' is not in camel case camelcase + 29:3 error Identifier 'modified_gmt' is not in camel case camelcase + 61:5 error Identifier 'date_gmt' is not in camel case camelcase + 63:5 error Identifier 'modified_gmt' is not in camel case camelcase + 145:1 error Line 145 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/feed/index.js + 32:5 error Identifier 'exclude_followed' is not in camel case camelcase + 44:3 error Identifier 'feed_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/feed/test/index.js + 18:27 error Identifier 'blog_ID' is not in camel case camelcase + 18:49 error Identifier 'subscribe_URL' is not in camel case camelcase + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 37:37 error Identifier 'exclude_followed' is not in camel case camelcase + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 56:37 error Identifier 'exclude_followed' is not in camel case camelcase + 75:38 error Identifier 'exclude_followed' is not in camel case camelcase + 97:9 error Identifier 'blog_ID' is not in camel case camelcase + 98:9 error Identifier 'feed_URL' is not in camel case camelcase + 99:9 error Identifier 'subscribe_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/following/mine/delete/index.js + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/following/mine/delete/test/index.js + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 71:1 error Line 71 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/following/mine/new/test/index.js + 63:5 error Identifier 'blog_ID' is not in camel case camelcase + 64:5 error Identifier 'feed_ID' is not in camel case camelcase + 65:5 error Identifier 'date_subscribed' is not in camel case camelcase + 66:5 error Identifier 'delivery_methods' is not in camel case camelcase + 67:5 error Identifier 'is_owner' is not in camel case camelcase + 76:6 error Identifier 'feed_URL' is not in camel case camelcase + 77:6 error Identifier 'blog_ID' is not in camel case camelcase + 78:6 error Identifier 'feed_ID' is not in camel case camelcase + 79:6 error Identifier 'date_subscribed' is not in camel case camelcase + 80:6 error Identifier 'delivery_methods' is not in camel case camelcase + 81:6 error Identifier 'is_owner' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/following/mine/test/index.js + 25:1 error 'state/action-types' import is duplicated no-duplicate-imports + 36:2 error Identifier 'total_subscriptions' is not in camel case camelcase + 40:4 error Identifier 'blog_ID' is not in camel case camelcase + 42:4 error Identifier 'date_subscribed' is not in camel case camelcase + 46:4 error Identifier 'blog_ID' is not in camel case camelcase + 48:4 error Identifier 'date_subscribed' is not in camel case camelcase + 123:9 error Identifier 'is_following' is not in camel case camelcase + 124:9 error Identifier 'feed_URL' is not in camel case camelcase + 136:5 error Identifier 'total_subscriptions' is not in camel case camelcase + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + 164:9 error Identifier 'is_following' is not in camel case camelcase + 165:9 error Identifier 'feed_URL' is not in camel case camelcase + 175:1 error Line 175 exceeds the maximum line length of 100 max-len + 180:5 error Identifier 'total_subscriptions' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/following/mine/test/utils.js + 16:2 error Identifier 'total_subscriptions' is not in camel case camelcase + 20:4 error Identifier 'blog_ID' is not in camel case camelcase + 22:4 error Identifier 'date_subscribed' is not in camel case camelcase + 26:4 error Identifier 'blog_ID' is not in camel case camelcase + 28:4 error Identifier 'date_subscribed' is not in camel case camelcase + 51:5 error Identifier 'blog_ID' is not in camel case camelcase + 53:5 error Identifier 'feed_URL' is not in camel case camelcase + 54:5 error Identifier 'date_subscribed' is not in camel case camelcase + 58:5 error Identifier 'blog_ID' is not in camel case camelcase + 60:5 error Identifier 'feed_URL' is not in camel case camelcase + 61:5 error Identifier 'date_subscribed' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/following/mine/utils.js + 24:4 error Identifier 'feed_URL' is not in camel case camelcase + 25:4 error Identifier 'blog_ID' is not in camel case camelcase + 26:4 error Identifier 'feed_ID' is not in camel case camelcase + 27:4 error Identifier 'date_subscribed' is not in camel case camelcase + 28:4 error Identifier 'delivery_methods' is not in camel case camelcase + 29:4 error Identifier 'is_owner' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/recommendations/sites/index.js + 22:35 error Identifier 'posts_per_site' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/recommendations/sites/test/index.js + 24:4 error Identifier 'blog_id' is not in camel case camelcase + 25:4 error Identifier 'feed_id' is not in camel case camelcase + 26:4 error Identifier 'blog_title' is not in camel case camelcase + 27:4 error Identifier 'blog_url' is not in camel case camelcase + 31:4 error Identifier 'blog_id' is not in camel case camelcase + 32:4 error Identifier 'feed_id' is not in camel case camelcase + 33:4 error Identifier 'blog_title' is not in camel case camelcase + 34:4 error Identifier 'blog_url' is not in camel case camelcase + 38:4 error Identifier 'blog_id' is not in camel case camelcase + 39:4 error Identifier 'feed_id' is not in camel case camelcase + 40:4 error Identifier 'blog_title' is not in camel case camelcase + 41:4 error Identifier 'blog_url' is not in camel case camelcase + 57:43 error Identifier 'posts_per_site' is not in camel case camelcase + 89:1 error Line 89 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/site/comment-email-subscriptions/new/index.js + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/site/comment-email-subscriptions/new/test/index.js + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/site/post-email-subscriptions/delete/test/index.js + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/site/post-email-subscriptions/new/index.js + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/site/post-email-subscriptions/new/test/index.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 49:6 error Identifier 'delivery_frequency' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/site/post-email-subscriptions/update/test/index.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 31:10 error Identifier 'blog_ID' is not in camel case camelcase + 32:10 error Identifier 'delivery_frequency' is not in camel case camelcase + 34:12 error Identifier 'post_delivery_frequency' is not in camel case camelcase + 56:7 error Identifier 'delivery_frequency' is not in camel case camelcase + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/site/post-email-subscriptions/utils.js + 15:4 error Identifier 'delivery_frequency' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/sites/posts/follow/index.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/sites/posts/mute/index.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/tags/index.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/tags/mine/delete/index.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/tags/mine/delete/test/index.js + 21:2 error Identifier 'removed_tag' is not in camel case camelcase + 27:4 error Identifier 'display_name' is not in camel case camelcase + 34:4 error Identifier 'display_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/tags/mine/new/test/index.js + 24:2 error Identifier 'added_tag' is not in camel case camelcase + 30:4 error Identifier 'display_name' is not in camel case camelcase + 37:4 error Identifier 'display_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/tags/test/index.js + 28:4 error Identifier 'display_name' is not in camel case camelcase + 35:4 error Identifier 'display_name' is not in camel case camelcase + 46:3 error Identifier 'display_name' is not in camel case camelcase + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/tags/test/utils.js + 19:4 error Identifier 'display_name' is not in camel case camelcase + 26:4 error Identifier 'display_name' is not in camel case camelcase + 54:3 error Identifier 'display_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/read/teams/test/index.js + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/activity/from-api.js + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/activity/index.js + 33:7 error Identifier 'date_end' is not in camel case camelcase + 34:7 error Identifier 'date_start' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/activity/test/from-api.js + 22:3 error Identifier 'external_user_id' is not in camel case camelcase + 23:3 error Identifier 'wpcom_user_id' is not in camel case camelcase + 35:3 error Identifier 'object_id' is not in camel case camelcase + 36:3 error Identifier 'object_type' is not in camel case camelcase + 37:3 error Identifier 'object_status' is not in camel case camelcase + 41:3 error Identifier 'jetpack_version' is not in camel case camelcase + 42:3 error Identifier 'blog_id' is not in camel case camelcase + 45:2 error Identifier 'activity_id' is not in camel case camelcase + 47:2 error Identifier 'is_rewindable' is not in camel case camelcase + 48:2 error Identifier 'rewind_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/activity/test/index.js + 31:5 error Identifier 'external_user_id' is not in camel case camelcase + 32:5 error Identifier 'wpcom_user_id' is not in camel case camelcase + 44:5 error Identifier 'object_id' is not in camel case camelcase + 45:5 error Identifier 'object_type' is not in camel case camelcase + 46:5 error Identifier 'object_status' is not in camel case camelcase + 50:5 error Identifier 'jetpack_version' is not in camel case camelcase + 51:5 error Identifier 'blog_id' is not in camel case camelcase + 54:4 error Identifier 'activity_id' is not in camel case camelcase + 55:4 error Identifier 'is_rewindable' is not in camel case camelcase + 56:4 error Identifier 'rewind_id' is not in camel case camelcase + 113:4 error Identifier 'date_end' is not in camel case camelcase + 114:4 error Identifier 'date_start' is not in camel case camelcase + 131:7 error Identifier 'date_end' is not in camel case camelcase + 132:7 error Identifier 'date_start' is not in camel case camelcase + 160:7 error Identifier 'date_end' is not in camel case camelcase + 161:7 error Identifier 'date_start' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/automated-transfer/eligibility/index.js + 28:2 error Identifier 'transfer_already_exists' is not in camel case camelcase + 29:2 error Identifier 'no_business_plan' is not in camel case camelcase + 30:2 error Identifier 'no_jetpack_sites' is not in camel case camelcase + 31:2 error Identifier 'no_vip_sites' is not in camel case camelcase + 32:2 error Identifier 'site_private' is not in camel case camelcase + 33:2 error Identifier 'site_graylisted' is not in camel case camelcase + 34:2 error Identifier 'non_admin_user' is not in camel case camelcase + 35:2 error Identifier 'not_using_custom_domain' is not in camel case camelcase + 36:2 error Identifier 'not_domain_owner' is not in camel case camelcase + 37:2 error Identifier 'no_wpcom_nameservers' is not in camel case camelcase + 38:2 error Identifier 'not_resolving_to_wpcom' is not in camel case camelcase + 39:2 error Identifier 'no_ssl_certificate' is not in camel case camelcase + 40:2 error Identifier 'email_unverified' is not in camel case camelcase + 41:2 error Identifier 'excessive_disk_space' is not in camel case camelcase + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 64:32 error Identifier 'support_url' is not in camel case camelcase + 67:16 error Identifier 'support_url' is not in camel case camelcase + 95:3 error Identifier 'has_warnings' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/automated-transfer/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/automated-transfer/initiate/test/index.js + 32:2 error Identifier 'transfer_id' is not in camel case camelcase + 38:2 error Identifier 'transfer_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/automated-transfer/status/index.js + 41:12 error Identifier 'uploaded_plugin_slug' is not in camel case camelcase + 41:34 error Identifier 'transfer_id' is not in camel case camelcase + 43:19 error Identifier 'uploaded_plugin_slug' is not in camel case camelcase + 54:5 error Identifier 'transfer_id' is not in camel case camelcase + 54:5 error Identifier 'transfer_id' is not in camel case camelcase + 55:5 error Identifier 'uploaded_plugin_slug' is not in camel case camelcase + 55:5 error Identifier 'uploaded_plugin_slug' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/automated-transfer/status/test/index.js + 23:2 error Identifier 'blog_id' is not in camel case camelcase + 25:2 error Identifier 'uploaded_plugin_slug' is not in camel case camelcase + 26:2 error Identifier 'transfer_id' is not in camel case camelcase + 30:2 error Identifier 'blog_id' is not in camel case camelcase + 32:2 error Identifier 'uploaded_plugin_slug' is not in camel case camelcase + 66:5 error Identifier 'transfer_id' is not in camel case camelcase + 67:5 error Identifier 'uploaded_plugin_slug' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/blog-stickers/add/index.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/blog-stickers/index.js + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/blog-stickers/remove/index.js + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments-tree/index.js + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 82:1 error Expected indentation of 4 tabs but found 5 indent + 83:1 error Expected indentation of 3 tabs but found 4 indent + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments-tree/test/index.js + 42:5 error Identifier 'comments_tree' is not in camel case camelcase + 43:5 error Identifier 'pingbacks_tree' is not in camel case camelcase + 44:5 error Identifier 'trackbacks_tree' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments/index.js + 179:1 error Expected indentation of 4 tabs but found 5 indent + 180:1 error Expected indentation of 3 tabs but found 4 indent + 191:1 error Line 191 exceeds the maximum line length of 100 max-len + 192:1 error Line 192 exceeds the maximum line length of 100 max-len + 193:1 error Line 193 exceeds the maximum line length of 100 max-len + 197:1 error Expected indentation of 4 tabs but found 5 indent + 198:1 error Expected indentation of 4 tabs but found 5 indent + 198:6 error Identifier 'author_url' is not in camel case camelcase + 199:1 error Expected indentation of 4 tabs but found 5 indent + 200:1 error Expected indentation of 3 tabs but found 4 indent + 252:1 error Line 252 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments/likes/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments/likes/mine/delete/index.js + 31:84 error Identifier 'like_count' is not in camel case camelcase + 38:4 error Identifier 'like_count' is not in camel case camelcase + 38:4 error Identifier 'like_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments/likes/mine/delete/test/index.js + 54:5 error Identifier 'like_count' is not in camel case camelcase + 65:5 error Identifier 'like_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments/likes/mine/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments/likes/new/index.js + 31:84 error Identifier 'like_count' is not in camel case camelcase + 38:4 error Identifier 'like_count' is not in camel case camelcase + 38:4 error Identifier 'like_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments/likes/new/test/index.js + 54:5 error Identifier 'like_count' is not in camel case camelcase + 65:5 error Identifier 'like_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments/replies/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/comments/replies/new/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/jitm/index.js + 15:1 error 'state/data-layer/wpcom-http/utils' import is duplicated no-duplicate-imports + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 85:7 error Identifier 'message_path' is not in camel case camelcase + 87:6 error Identifier 'http_envelope' is not in camel case camelcase + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 112:7 error Identifier 'feature_class' is not in camel case camelcase + 115:6 error Identifier 'http_envelope' is not in camel case camelcase + 135:1 error Line 135 exceeds the maximum line length of 100 max-len + 177:54 error Identifier 'site_id' is not in camel case camelcase + 178:34 error Identifier 'site_id' is not in camel case camelcase + 188:53 error Identifier 'site_id' is not in camel case camelcase + 189:33 error Identifier 'site_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/jitm/test/index.js + 46:5 error Identifier 'action_site_selected' is not in camel case camelcase + 50:5 error Identifier 'action_loading' is not in camel case camelcase + 53:5 error Identifier 'action_loaded' is not in camel case camelcase + 56:5 error Identifier 'action_transition' is not in camel case camelcase + 82:33 error Identifier 'message_path' is not in camel case camelcase + 83:8 error Identifier 'http_envelope' is not in camel case camelcase + 106:5 error Identifier 'action_transition' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/media/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/media/test/index.js + 12:1 error '../' import is duplicated no-duplicate-imports + 123:1 error Expected indentation of 2 tabs but found 3 indent + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/plugins/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/plugins/new/index.js + 49:3 error Identifier 'unsupported_mime_type' is not in camel case camelcase + 78:4 error Identifier 'plugin_id' is not in camel case camelcase + 100:4 error Identifier 'error_code' is not in camel case camelcase + 101:4 error Identifier 'error_message' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/plugins/new/test/index.js + 26:2 error Identifier 'author_url' is not in camel case camelcase + 32:2 error Identifier 'plugin_url' is not in camel case camelcase + 68:5 error Identifier 'edit_theme_options' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/posts/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/posts/replies/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/posts/replies/new/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/simple-payments/index.js + 116:3 error Identifier 'featured_image' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/sites/simple-payments/test/index.js + 19:4 error Identifier 'featured_image' is not in camel case camelcase + 47:4 error Identifier 'featured_image' is not in camel case camelcase + 76:4 error Identifier 'featured_image' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/timezones/index.js + 37:28 error Identifier 'manual_utc_offsets' is not in camel case camelcase + 37:59 error Identifier 'timezones_by_continent' is not in camel case camelcase + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/timezones/test/index.js + 40:5 error Identifier 'manual_utc_offsets' is not in camel case camelcase + 50:5 error Identifier 'timezones_by_continent' is not in camel case camelcase + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/users/index.js + 30:4 error Identifier 'display_name' is not in camel case camelcase + 53:6 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/users/test/index.js + 27:4 error Identifier 'display_name' is not in camel case camelcase + 60:7 error Identifier 'per_page' is not in camel case camelcase + 86:7 error Identifier 'per_page' is not in camel case camelcase + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + 149:7 error Identifier 'per_page' is not in camel case camelcase + 199:7 error Identifier 'per_page' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/videos/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/data-layer/wpcom/videos/poster/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 31:37 error Identifier 'at_time' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/document-head/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/document-head/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/document-head/test/reducer.js + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/document-head/test/selectors.js + 119:1 error Line 119 exceeds the maximum line length of 100 max-len + 151:1 error Line 151 exceeds the maximum line length of 100 max-len + 178:1 error Line 178 exceeds the maximum line length of 100 max-len + 260:1 error Line 260 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/domains/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 18:4 error Identifier 'domain_name' is not in camel case camelcase + 32:4 error Identifier 'domain_name' is not in camel case camelcase + 46:4 error Identifier 'domain_name' is not in camel case camelcase + 75:4 error Identifier 'search_box_value' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/domains/management/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/domains/management/reducer.js + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/domains/management/schema.js + 6:3 error Identifier 'first_name' is not in camel case camelcase + 7:3 error Identifier 'last_name' is not in camel case camelcase + 14:3 error Identifier 'postal_code' is not in camel case camelcase + 15:3 error Identifier 'country_code' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/domains/management/test/reducer.js + 211:1 error Line 211 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/domains/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/domains/suggestions/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/domains/suggestions/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/domains/suggestions/schema.js + 13:6 error Identifier 'domain_name' is not in camel case camelcase + 15:6 error Identifier 'product_id' is not in camel case camelcase + 16:6 error Identifier 'product_slug' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/domains/suggestions/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/domains/suggestions/test/actions.js + 33:3 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 40:3 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 44:5 error Identifier 'domain_name' is not in camel case camelcase + 44:48 error Identifier 'product_id' is not in camel case camelcase + 44:64 error Identifier 'product_slug' is not in camel case camelcase + 45:5 error Identifier 'domain_name' is not in camel case camelcase + 45:49 error Identifier 'product_id' is not in camel case camelcase + 45:64 error Identifier 'product_slug' is not in camel case camelcase + 109:1 error Line 109 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/domains/suggestions/test/reducer.js + 49:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 52:7 error Identifier 'domain_name' is not in camel case camelcase + 52:50 error Identifier 'product_id' is not in camel case camelcase + 52:66 error Identifier 'product_slug' is not in camel case camelcase + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 53:7 error Identifier 'domain_name' is not in camel case camelcase + 53:51 error Identifier 'product_id' is not in camel case camelcase + 53:66 error Identifier 'product_slug' is not in camel case camelcase + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 64:7 error Identifier 'domain_name' is not in camel case camelcase + 66:7 error Identifier 'product_id' is not in camel case camelcase + 67:7 error Identifier 'product_slug' is not in camel case camelcase + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 69:8 error Identifier 'domain_name' is not in camel case camelcase + 69:52 error Identifier 'product_id' is not in camel case camelcase + 69:67 error Identifier 'product_slug' is not in camel case camelcase + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 78:7 error Identifier 'domain_name' is not in camel case camelcase + 80:7 error Identifier 'product_id' is not in camel case camelcase + 81:7 error Identifier 'product_slug' is not in camel case camelcase + 83:1 error Line 83 exceeds the maximum line length of 100 max-len + 83:8 error Identifier 'domain_name' is not in camel case camelcase + 83:52 error Identifier 'product_id' is not in camel case camelcase + 83:67 error Identifier 'product_slug' is not in camel case camelcase + 90:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 93:1 error Line 93 exceeds the maximum line length of 100 max-len + 93:7 error Identifier 'domain_name' is not in camel case camelcase + 93:49 error Identifier 'product_id' is not in camel case camelcase + 93:65 error Identifier 'product_slug' is not in camel case camelcase + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + 94:7 error Identifier 'domain_name' is not in camel case camelcase + 94:50 error Identifier 'product_id' is not in camel case camelcase + 94:65 error Identifier 'product_slug' is not in camel case camelcase + 103:1 error Line 103 exceeds the maximum line length of 100 max-len + 105:7 error Identifier 'domain_name' is not in camel case camelcase + 107:7 error Identifier 'product_id' is not in camel case camelcase + 108:7 error Identifier 'product_slug' is not in camel case camelcase + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 110:8 error Identifier 'domain_name' is not in camel case camelcase + 110:52 error Identifier 'product_id' is not in camel case camelcase + 110:67 error Identifier 'product_slug' is not in camel case camelcase + 112:1 error Line 112 exceeds the maximum line length of 100 max-len + 114:7 error Identifier 'domain_name' is not in camel case camelcase + 116:7 error Identifier 'product_id' is not in camel case camelcase + 117:7 error Identifier 'product_slug' is not in camel case camelcase + 119:1 error Line 119 exceeds the maximum line length of 100 max-len + 119:8 error Identifier 'domain_name' is not in camel case camelcase + 119:51 error Identifier 'product_id' is not in camel case camelcase + 119:66 error Identifier 'product_slug' is not in camel case camelcase + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + 128:7 error Identifier 'domain_name' is not in camel case camelcase + 130:7 error Identifier 'product_id' is not in camel case camelcase + 131:7 error Identifier 'product_slug' is not in camel case camelcase + 133:1 error Line 133 exceeds the maximum line length of 100 max-len + 133:8 error Identifier 'domain_name' is not in camel case camelcase + 133:52 error Identifier 'product_id' is not in camel case camelcase + 133:67 error Identifier 'product_slug' is not in camel case camelcase + 135:1 error Line 135 exceeds the maximum line length of 100 max-len + 137:7 error Identifier 'domain_name' is not in camel case camelcase + 139:7 error Identifier 'product_id' is not in camel case camelcase + 140:7 error Identifier 'product_slug' is not in camel case camelcase + 142:1 error Line 142 exceeds the maximum line length of 100 max-len + 142:8 error Identifier 'domain_name' is not in camel case camelcase + 142:51 error Identifier 'product_id' is not in camel case camelcase + 142:66 error Identifier 'product_slug' is not in camel case camelcase + 147:6 error Identifier 'domain_name' is not in camel case camelcase + 149:6 error Identifier 'product_id' is not in camel case camelcase + 150:6 error Identifier 'product_slug' is not in camel case camelcase + 152:1 error Line 152 exceeds the maximum line length of 100 max-len + 152:7 error Identifier 'domain_name' is not in camel case camelcase + 152:53 error Identifier 'product_id' is not in camel case camelcase + 152:68 error Identifier 'product_slug' is not in camel case camelcase + 159:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 169:1 error Line 169 exceeds the maximum line length of 100 max-len + 171:7 error Identifier 'domain_name' is not in camel case camelcase + 173:7 error Identifier 'product_id' is not in camel case camelcase + 174:7 error Identifier 'product_slug' is not in camel case camelcase + 176:1 error Line 176 exceeds the maximum line length of 100 max-len + 176:8 error Identifier 'domain_name' is not in camel case camelcase + 176:52 error Identifier 'product_id' is not in camel case camelcase + 176:67 error Identifier 'product_slug' is not in camel case camelcase + 178:1 error Line 178 exceeds the maximum line length of 100 max-len + 180:7 error Identifier 'domain_name' is not in camel case camelcase + 182:7 error Identifier 'product_id' is not in camel case camelcase + 183:7 error Identifier 'product_slug' is not in camel case camelcase + 186:7 error Identifier 'domain_name' is not in camel case camelcase + 188:7 error Identifier 'product_id' is not in camel case camelcase + 189:7 error Identifier 'product_slug' is not in camel case camelcase + 198:1 error Line 198 exceeds the maximum line length of 100 max-len + 200:8 error Identifier 'domain_name' is not in camel case camelcase + 202:8 error Identifier 'product_id' is not in camel case camelcase + 203:8 error Identifier 'product_slug' is not in camel case camelcase + 206:8 error Identifier 'domain_name' is not in camel case camelcase + 208:8 error Identifier 'product_id' is not in camel case camelcase + 209:8 error Identifier 'product_slug' is not in camel case camelcase + 219:1 error Line 219 exceeds the maximum line length of 100 max-len + 221:8 error Identifier 'domain_name' is not in camel case camelcase + 223:8 error Identifier 'product_id' is not in camel case camelcase + 224:8 error Identifier 'product_slug' is not in camel case camelcase + 227:8 error Identifier 'domain_name' is not in camel case camelcase + 229:8 error Identifier 'product_id' is not in camel case camelcase + 230:8 error Identifier 'product_slug' is not in camel case camelcase + 240:1 error Line 240 exceeds the maximum line length of 100 max-len + 241:25 error Identifier 'product_id' is not in camel case camelcase + 241:41 error Identifier 'product_slug' is not in camel case camelcase + 242:25 error Identifier 'product_id' is not in camel case camelcase + 242:40 error Identifier 'product_slug' is not in camel case camelcase + 262:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 269:1 error Line 269 exceeds the maximum line length of 100 max-len + 275:1 error Line 275 exceeds the maximum line length of 100 max-len + 281:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 289:1 error Line 289 exceeds the maximum line length of 100 max-len + 295:1 error Line 295 exceeds the maximum line length of 100 max-len + 301:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 309:1 error Line 309 exceeds the maximum line length of 100 max-len + 315:1 error Line 315 exceeds the maximum line length of 100 max-len + 321:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 329:1 error Line 329 exceeds the maximum line length of 100 max-len + 330:1 error Line 330 exceeds the maximum line length of 100 max-len + 343:1 error Line 343 exceeds the maximum line length of 100 max-len + 349:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 359:1 error Line 359 exceeds the maximum line length of 100 max-len + 366:1 error Line 366 exceeds the maximum line length of 100 max-len + 372:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 380:1 error Line 380 exceeds the maximum line length of 100 max-len + 387:1 error Line 387 exceeds the maximum line length of 100 max-len + 393:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 401:1 error Line 401 exceeds the maximum line length of 100 max-len + 405:3 error Test title is used multiple times in the same test suite jest/no-identical-title + 407:1 error Line 407 exceeds the maximum line length of 100 max-len + 413:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 423:1 error Line 423 exceeds the maximum line length of 100 max-len + 430:1 error Line 430 exceeds the maximum line length of 100 max-len + 436:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 446:1 error Line 446 exceeds the maximum line length of 100 max-len + 447:1 error Line 447 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/domains/suggestions/test/selectors.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 26:10 error Identifier 'domain_name' is not in camel case camelcase + 28:10 error Identifier 'product_id' is not in camel case camelcase + 29:10 error Identifier 'product_slug' is not in camel case camelcase + 32:10 error Identifier 'domain_name' is not in camel case camelcase + 34:10 error Identifier 'product_id' is not in camel case camelcase + 35:10 error Identifier 'product_slug' is not in camel case camelcase + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 40:10 error Identifier 'domain_name' is not in camel case camelcase + 42:10 error Identifier 'product_id' is not in camel case camelcase + 43:10 error Identifier 'product_slug' is not in camel case camelcase + 46:10 error Identifier 'domain_name' is not in camel case camelcase + 48:10 error Identifier 'product_id' is not in camel case camelcase + 49:10 error Identifier 'product_slug' is not in camel case camelcase + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 67:7 error Identifier 'domain_name' is not in camel case camelcase + 67:49 error Identifier 'product_id' is not in camel case camelcase + 67:65 error Identifier 'product_slug' is not in camel case camelcase + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 68:7 error Identifier 'domain_name' is not in camel case camelcase + 68:50 error Identifier 'product_id' is not in camel case camelcase + 68:65 error Identifier 'product_slug' is not in camel case camelcase + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 118:1 error Line 118 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/domains/suggestions/test/utils.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 31:5 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/domains/suggestions/utils.js + 24:8 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 31:3 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + 31:3 error Identifier 'include_wordpressdotcom' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/followers/actions.js + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/followers/reducer.js + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/followers/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/followers/test/reducer.js + 26:32 error Identifier 'avatar_URL' is not in camel case camelcase + 27:32 error Identifier 'avatar_URL' is not in camel case camelcase + 31:62 error Identifier 'avatar_URL' is not in camel case camelcase + 39:32 error Identifier 'avatar_URL' is not in camel case camelcase + 40:32 error Identifier 'avatar_URL' is not in camel case camelcase + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 44:62 error Identifier 'avatar_URL' is not in camel case camelcase + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 51:65 error Identifier 'avatar_URL' is not in camel case camelcase + 55:32 error Identifier 'avatar_URL' is not in camel case camelcase + 56:32 error Identifier 'avatar_URL' is not in camel case camelcase + 62:57 error Identifier 'avatar_URL' is not in camel case camelcase + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 130:1 error Line 130 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/followers/test/selectors.js + 22:8 error Identifier 'avatar_URL' is not in camel case camelcase + 25:8 error Identifier 'display_name' is not in camel case camelcase + 30:8 error Identifier 'avatar_URL' is not in camel case camelcase + 33:8 error Identifier 'display_name' is not in camel case camelcase + 46:6 error Identifier 'avatar_URL' is not in camel case camelcase + 49:6 error Identifier 'display_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/followers/test/utils.js + 26:4 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/client/state/followers/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 29:11 error Identifier 'avatar_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/geo/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/geo/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/geo/schema.js + 7:3 error Identifier 'country_short' is not in camel case camelcase + 8:3 error Identifier 'country_long' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/geo/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/geo/test/actions.js + 30:5 error Identifier 'country_short' is not in camel case camelcase + 31:5 error Identifier 'country_long' is not in camel case camelcase + 41:6 error Identifier 'country_short' is not in camel case camelcase + 42:6 error Identifier 'country_long' is not in camel case camelcase + 67:7 error Identifier 'country_short' is not in camel case camelcase + 68:7 error Identifier 'country_long' is not in camel case camelcase + 80:8 error Identifier 'country_short' is not in camel case camelcase + 81:8 error Identifier 'country_long' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/geo/test/reducer.js + 74:6 error Identifier 'country_short' is not in camel case camelcase + 75:6 error Identifier 'country_long' is not in camel case camelcase + 84:5 error Identifier 'country_short' is not in camel case camelcase + 85:5 error Identifier 'country_long' is not in camel case camelcase + 95:5 error Identifier 'country_short' is not in camel case camelcase + 96:5 error Identifier 'country_long' is not in camel case camelcase + 105:5 error Identifier 'country_short' is not in camel case camelcase + 106:5 error Identifier 'country_long' is not in camel case camelcase + 114:5 error Identifier 'country_short' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/geo/test/selectors.js + 33:7 error Identifier 'country_short' is not in camel case camelcase + 34:7 error Identifier 'country_long' is not in camel case camelcase + 44:5 error Identifier 'country_short' is not in camel case camelcase + 45:5 error Identifier 'country_long' is not in camel case camelcase + 69:7 error Identifier 'country_short' is not in camel case camelcase + 70:7 error Identifier 'country_long' is not in camel case camelcase + 98:7 error Identifier 'country_short' is not in camel case camelcase + 99:7 error Identifier 'country_long' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/google-apps-users/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/google-apps-users/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/google-apps-users/test/actions.js + 38:7 error Identifier 'site_id' is not in camel case camelcase + 43:6 error Identifier 'license_cost' is not in camel case camelcase + 44:6 error Identifier 'license_type' is not in camel case camelcase + 45:6 error Identifier 'licenses_in_use' is not in camel case camelcase + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 46:6 error Identifier 'purchase_license' is not in camel case camelcase + 47:6 error Identifier 'purchased_licenses' is not in camel case camelcase + 106:7 error Identifier 'site_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/google-apps-users/test/selectors.js + 22:54 error Identifier 'site_id' is not in camel case camelcase + 23:55 error Identifier 'site_id' is not in camel case camelcase + 24:51 error Identifier 'site_id' is not in camel case camelcase + 25:53 error Identifier 'site_id' is not in camel case camelcase + 32:54 error Identifier 'site_id' is not in camel case camelcase + 33:51 error Identifier 'site_id' is not in camel case camelcase + 39:52 error Identifier 'site_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/happiness-engineers/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/happiness-engineers/test/actions.js + 28:7 error Identifier 'avatar_URL' is not in camel case camelcase + 29:7 error Identifier 'avatar_URL' is not in camel case camelcase + 34:29 error Identifier 'avatar_URL' is not in camel case camelcase + 34:55 error Identifier 'avatar_URL' is not in camel case camelcase + 45:23 error Identifier 'avatar_URL' is not in camel case camelcase + 59:38 error Identifier 'avatar_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/happiness-engineers/test/reducer.js + 72:29 error Identifier 'avatar_URL' is not in camel case camelcase + 72:55 error Identifier 'avatar_URL' is not in camel case camelcase + 80:17 error Identifier 'avatar_URL' is not in camel case camelcase + 81:17 error Identifier 'avatar_URL' is not in camel case camelcase + 86:29 error Identifier 'avatar_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/happiness-engineers/test/selectors.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/happychat/chat/reducer.js + 84:6 error Identifier 'user_id' is not in camel case camelcase + 145:8 error Identifier 'user_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/happychat/chat/schema.js + 14:3 error Identifier 'user_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/happychat/connection/actions.js + 277:30 error Identifier 'event_type' is not in camel case camelcase + 295:30 error Identifier 'event_type' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/happychat/connection/test/actions.js + 17:50 error Identifier 'country_long' is not in camel case camelcase + 21:28 error Identifier 'country_long' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/happychat/middleware.js + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 125:3 error Identifier 'signer_user_id' is not in camel case camelcase + 131:14 error Identifier 'session_id' is not in camel case camelcase + 131:26 error Identifier 'geo_location' is not in camel case camelcase + 132:32 error Identifier 'geo_location' is not in camel case camelcase + 133:25 error Identifier 'session_id' is not in camel case camelcase + 133:25 error Identifier 'session_id' is not in camel case camelcase + 219:1 error Line 219 exceeds the maximum line length of 100 max-len + 288:1 error Line 288 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/happychat/selectors/is-happychat-client-connected.js + 6:1 error Line 6 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/happychat/selectors/is-happychat-connection-uninitialized.js + 6:1 error Line 6 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/happychat/selectors/was-happychat-recently-active.js + 6:1 error Line 6 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/happychat/test/middleware.js + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 309:1 error Line 309 exceeds the maximum line length of 100 max-len + 394:1 error Line 394 exceeds the maximum line length of 100 max-len + 509:1 error Line 509 exceeds the maximum line length of 100 max-len + 525:1 error Line 525 exceeds the maximum line length of 100 max-len + 545:1 error Line 545 exceeds the maximum line length of 100 max-len + 554:1 error Line 554 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/happychat/test/selectors.js + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + 196:8 error Identifier 'manage_options' is not in camel case camelcase + 205:9 error Identifier 'product_id' is not in camel case camelcase + 206:9 error Identifier 'product_slug' is not in camel case camelcase + 225:8 error Identifier 'manage_options' is not in camel case camelcase + 233:19 error Identifier 'is_automated_transfer' is not in camel case camelcase + 234:16 error Identifier 'product_slug' is not in camel case camelcase + 262:4 warning Skipped test jest/no-disabled-tests + +/Users/seear/repos/wp-calypso/client/state/happychat/user/schema.js + 7:3 error Identifier 'country_long' is not in camel case camelcase + 8:3 error Identifier 'country_short' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/happychat/user/test/reducer.js + 26:6 error Identifier 'country_long' is not in camel case camelcase + 32:29 error Identifier 'country_long' is not in camel case camelcase + 37:6 error Identifier 'country_long' is not in camel case camelcase + 43:29 error Identifier 'country_long' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/help/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/help/courses/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/help/courses/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/help/directly/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/help/directly/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/help/directly/test/reducer.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/help/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 12:1 error 'state/utils' import is duplicated no-duplicate-imports + +/Users/seear/repos/wp-calypso/client/state/help/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/help/ticket/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/help/ticket/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/help/ticket/selectors.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'state' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/help/ticket/test/test-data/index.js + 3:2 error Identifier 'is_user_eligible' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/http/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/http/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/http/test/index.js + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/http/test/mocks/superagent/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/initial-state.js + 94:2 error Unexpected console statement no-console + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/actions.js + 214:7 error Identifier 'calypso_env' is not in camel case camelcase + 239:7 error Identifier 'jetpack_connect_url' is not in camel case camelcase + 240:7 error Identifier 'calypso_env' is not in camel case camelcase + 241:7 error Identifier 'auth_type' is not in camel case camelcase + 264:7 error Identifier 'calypso_env' is not in camel case camelcase + 287:7 error Identifier 'calypso_env' is not in camel case camelcase + 329:8 error Identifier 'error_code' is not in camel case camelcase + 393:1 error Line 393 exceeds the maximum line length of 100 max-len + 393:12 error Identifier '_wp_nonce' is not in camel case camelcase + 393:23 error Identifier 'client_id' is not in camel case camelcase + 393:34 error Identifier 'redirect_uri' is not in camel case camelcase + 393:70 error Identifier 'jp_version' is not in camel case camelcase + 411:1 error Line 411 exceeds the maximum line length of 100 max-len + 417:15 error Identifier 'client_id' is not in camel case camelcase + 424:7 error Identifier 'site_visibility' is not in camel case camelcase + 425:7 error Identifier 'include_domain_only' is not in camel case camelcase + 435:14 error Identifier 'client_id' is not in camel case camelcase + 455:14 error Identifier 'client_id' is not in camel case camelcase + 464:8 error Identifier 'error_code' is not in camel case camelcase + 465:8 error Identifier 'error_name' is not in camel case camelcase + 466:8 error Identifier 'error_message' is not in camel case camelcase + 469:14 error Identifier 'client_id' is not in camel case camelcase + 474:15 error Identifier 'client_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/reducer/index.js + 9:1 error './jetpack-connect-site' import is duplicated no-duplicate-imports + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/reducer/jetpack-auth-attempts.js + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/reducer/jetpack-connect-authorize.js + 52:13 error Identifier 'plans_url' is not in camel case camelcase + 57:16 error Identifier 'plans_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/reducer/jetpack-connect-site.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/reducer/schema.js + 45:7 error Identifier '_wp_nonce' is not in camel case camelcase + 46:7 error Identifier 'client_id' is not in camel case camelcase + 48:7 error Identifier 'home_url' is not in camel case camelcase + 49:7 error Identifier 'jp_version' is not in camel case camelcase + 50:7 error Identifier 'new_user_started_connection' is not in camel case camelcase + 51:7 error Identifier 'redirect_after_auth' is not in camel case camelcase + 52:7 error Identifier 'redirect_uri' is not in camel case camelcase + 56:7 error Identifier 'site_icon' is not in camel case camelcase + 57:7 error Identifier 'site_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/reducer/test/jetpack-auth-attempts.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/reducer/test/jetpack-connect-authorize.js + 71:4 error Identifier 'plans_url' is not in camel case camelcase + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 120:6 error Identifier '_wp_nonce' is not in camel case camelcase + 121:6 error Identifier 'client_id' is not in camel case camelcase + 122:6 error Identifier 'redirect_uri' is not in camel case camelcase + 139:5 error Identifier 'client_id' is not in camel case camelcase + 140:5 error Identifier 'redirect_uri' is not in camel case camelcase + 159:1 error Line 159 exceeds the maximum line length of 100 max-len + 161:4 error Identifier 'redirect_uri' is not in camel case camelcase + 176:1 error Line 176 exceeds the maximum line length of 100 max-len + 192:9 error Identifier 'bearer_token' is not in camel case camelcase + 197:5 error Identifier 'bearer_token' is not in camel case camelcase + 197:5 error Identifier 'bearer_token' is not in camel case camelcase + 234:1 error Line 234 exceeds the maximum line length of 100 max-len + 244:21 error Identifier 'client_id' is not in camel case camelcase + 251:42 error Identifier 'client_id' is not in camel case camelcase + 260:42 error Identifier 'jetpack_version' is not in camel case camelcase + 268:1 error Line 268 exceeds the maximum line length of 100 max-len + 279:21 error Identifier 'client_id' is not in camel case camelcase + 282:44 error Identifier 'client_id' is not in camel case camelcase + 288:5 error Identifier 'client_id' is not in camel case camelcase + 289:5 error Identifier 'redirect_uri' is not in camel case camelcase + 303:5 error Identifier 'client_id' is not in camel case camelcase + 304:5 error Identifier 'redirect_uri' is not in camel case camelcase + 318:5 error Identifier 'client_id' is not in camel case camelcase + 319:5 error Identifier 'redirect_uri' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/reducer/test/jetpack-connect-sessions.js + 140:1 error Line 140 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/reducer/test/jetpack-sso.js + 32:3 error Identifier 'admin_url' is not in camel case camelcase + 39:3 error Identifier 'first_name' is not in camel case camelcase + 40:3 error Identifier 'last_name' is not in camel case camelcase + 41:3 error Identifier 'display_name' is not in camel case camelcase + 43:3 error Identifier 'two_step_enabled' is not in camel case camelcase + 44:3 error Identifier 'external_user_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/selectors.js + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/test/actions.js + 142:5 error Identifier 'redirect_uri' is not in camel case camelcase + 147:1 error Line 147 exceeds the maximum line length of 100 max-len + 175:4 error Identifier '_wp_nonce' is not in camel case camelcase + 176:4 error Identifier 'client_id' is not in camel case camelcase + 177:4 error Identifier 'redirect_uri' is not in camel case camelcase + 183:11 error Identifier '_wp_nonce' is not in camel case camelcase + 183:22 error Identifier 'client_id' is not in camel case camelcase + 183:33 error Identifier 'redirect_uri' is not in camel case camelcase + 189:42 error Identifier 'client_id' is not in camel case camelcase + 191:7 error Identifier '_wp_nonce' is not in camel case camelcase + 191:7 error Identifier '_wp_nonce' is not in camel case camelcase + 192:7 error Identifier 'redirect_uri' is not in camel case camelcase + 192:7 error Identifier 'redirect_uri' is not in camel case camelcase + 208:43 error Identifier 'client_id' is not in camel case camelcase + 211:7 error Identifier 'redirect_uri' is not in camel case camelcase + 211:7 error Identifier 'redirect_uri' is not in camel case camelcase + 218:8 error Identifier 'plans_url' is not in camel case camelcase + 232:17 error Identifier 'client_id' is not in camel case camelcase + 270:15 error Identifier 'client_id' is not in camel case camelcase + 273:8 error Identifier 'plans_url' is not in camel case camelcase + 286:16 error Identifier 'client_id' is not in camel case camelcase + 291:1 error Line 291 exceeds the maximum line length of 100 max-len + 298:17 error Identifier 'client_id' is not in camel case camelcase + 309:42 error Identifier 'client_id' is not in camel case camelcase + 311:7 error Identifier '_wp_nonce' is not in camel case camelcase + 311:7 error Identifier '_wp_nonce' is not in camel case camelcase + 312:7 error Identifier 'redirect_uri' is not in camel case camelcase + 312:7 error Identifier 'redirect_uri' is not in camel case camelcase + 334:15 error Identifier 'client_id' is not in camel case camelcase + 358:4 error Identifier 'is_vip' is not in camel case camelcase + 359:4 error Identifier 'admin_url' is not in camel case camelcase + 367:4 error Identifier 'first_name' is not in camel case camelcase + 368:4 error Identifier 'last_name' is not in camel case camelcase + 369:4 error Identifier 'display_name' is not in camel case camelcase + 371:4 error Identifier 'two_step_enabled' is not in camel case camelcase + 372:4 error Identifier 'external_user_id' is not in camel case camelcase + 380:7 error Identifier 'sso_nonce' is not in camel case camelcase + 386:8 error Identifier 'blog_details' is not in camel case camelcase + 387:8 error Identifier 'shared_details' is not in camel case camelcase + 424:7 error Identifier 'sso_nonce' is not in camel case camelcase + 465:7 error Identifier 'sso_nonce' is not in camel case camelcase + 470:8 error Identifier 'sso_url' is not in camel case camelcase + 506:7 error Identifier 'sso_nonce' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/test/selectors.js + 106:5 error Identifier '_wp_nonce' is not in camel case camelcase + 107:5 error Identifier 'client_id' is not in camel case camelcase + 108:5 error Identifier 'redirect_uri' is not in camel case camelcase + 148:8 error Identifier '_wp_nonce' is not in camel case camelcase + 149:8 error Identifier 'client_id' is not in camel case camelcase + 150:8 error Identifier 'redirect_uri' is not in camel case camelcase + 177:8 error Identifier 'client_id' is not in camel case camelcase + 202:8 error Identifier '_wp_nonce' is not in camel case camelcase + 203:8 error Identifier 'client_id' is not in camel case camelcase + 204:8 error Identifier 'redirect_uri' is not in camel case camelcase + 221:1 error Line 221 exceeds the maximum line length of 100 max-len + 269:6 error Identifier 'admin_url' is not in camel case camelcase + 282:6 error Identifier 'first_name' is not in camel case camelcase + 283:6 error Identifier 'last_name' is not in camel case camelcase + 284:6 error Identifier 'display_name' is not in camel case camelcase + 286:6 error Identifier 'two_step_enabled' is not in camel case camelcase + 287:6 error Identifier 'external_user_id' is not in camel case camelcase + 301:1 error Line 301 exceeds the maximum line length of 100 max-len + 316:1 error Line 316 exceeds the maximum line length of 100 max-len + 343:1 error Line 343 exceeds the maximum line length of 100 max-len + 411:1 error Line 411 exceeds the maximum line length of 100 max-len + 536:1 error Line 536 exceeds the maximum line length of 100 max-len + 606:1 error Line 606 exceeds the maximum line length of 100 max-len + 649:1 error Line 649 exceeds the maximum line length of 100 max-len + 671:8 error Identifier 'client_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/test/utils.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack-connect/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 12:1 error Line 12 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack-sync/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack-sync/test/actions.js + 38:4 error Identifier 'queue_finished' is not in camel case camelcase + 39:4 error Identifier 'sent_started' is not in camel case camelcase + 62:4 error Identifier 'is_scheduled' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack-sync/test/reducer.js + 27:3 error Identifier 'queue_finished' is not in camel case camelcase + 28:3 error Identifier 'sent_started' is not in camel case camelcase + 72:3 error Identifier 'queue_size' is not in camel case camelcase + 73:3 error Identifier 'queue_lag' is not in camel case camelcase + 74:3 error Identifier 'full_queue_size' is not in camel case camelcase + 75:3 error Identifier 'full_queue_lag' is not in camel case camelcase + 76:3 error Identifier 'is_scheduled' is not in camel case camelcase + 85:3 error Identifier 'queue_finished' is not in camel case camelcase + 86:3 error Identifier 'sent_started' is not in camel case camelcase + 126:3 error Identifier 'queue_size' is not in camel case camelcase + 127:3 error Identifier 'queue_lag' is not in camel case camelcase + 128:3 error Identifier 'full_queue_size' is not in camel case camelcase + 129:3 error Identifier 'full_queue_lag' is not in camel case camelcase + 130:3 error Identifier 'is_scheduled' is not in camel case camelcase + 170:1 error Line 170 exceeds the maximum line length of 100 max-len + 186:1 error Line 186 exceeds the maximum line length of 100 max-len + 194:1 error Line 194 exceeds the maximum line length of 100 max-len + 210:1 error Line 210 exceeds the maximum line length of 100 max-len + 294:1 error Line 294 exceeds the maximum line length of 100 max-len + 304:1 error Line 304 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack-sync/test/selectors.js + 30:2 error Identifier 'queue_finished' is not in camel case camelcase + 31:2 error Identifier 'sent_started' is not in camel case camelcase + 75:2 error Identifier 'queue_size' is not in camel case camelcase + 76:2 error Identifier 'queue_lag' is not in camel case camelcase + 77:2 error Identifier 'full_queue_size' is not in camel case camelcase + 78:2 error Identifier 'full_queue_lag' is not in camel case camelcase + 79:2 error Identifier 'is_scheduled' is not in camel case camelcase + 85:2 error Identifier 'queue_finished' is not in camel case camelcase + 86:2 error Identifier 'sent_started' is not in camel case camelcase + 130:2 error Identifier 'queue_size' is not in camel case camelcase + 131:2 error Identifier 'queue_lag' is not in camel case camelcase + 132:2 error Identifier 'full_queue_size' is not in camel case camelcase + 133:2 error Identifier 'full_queue_lag' is not in camel case camelcase + 134:2 error Identifier 'is_scheduled' is not in camel case camelcase + 147:2 error Identifier 'queue_finished' is not in camel case camelcase + 182:2 error Identifier 'queue_size' is not in camel case camelcase + 183:2 error Identifier 'queue_lag' is not in camel case camelcase + 184:2 error Identifier 'full_queue_size' is not in camel case camelcase + 185:2 error Identifier 'full_queue_lag' is not in camel case camelcase + 186:2 error Identifier 'is_scheduled' is not in camel case camelcase + 192:2 error Identifier 'queue_finished' is not in camel case camelcase + 193:2 error Identifier 'sent_started' is not in camel case camelcase + 233:2 error Identifier 'queue_size' is not in camel case camelcase + 234:2 error Identifier 'queue_lag' is not in camel case camelcase + 235:2 error Identifier 'full_queue_size' is not in camel case camelcase + 236:2 error Identifier 'full_queue_lag' is not in camel case camelcase + 237:2 error Identifier 'is_scheduled' is not in camel case camelcase + 336:1 error Line 336 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack/connection/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/jetpack/connection/test/actions.js + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 139:1 error Line 139 exceeds the maximum line length of 100 max-len + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + 211:1 error Line 211 exceeds the maximum line length of 100 max-len + 220:1 error Line 220 exceeds the maximum line length of 100 max-len + 251:1 error Line 251 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack/connection/test/fixture/index.js + 36:4 error Identifier 'edit_posts' is not in camel case camelcase + 49:4 error Identifier 'edit_posts' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack/connection/test/reducer.js + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 146:1 error Line 146 exceeds the maximum line length of 100 max-len + 168:1 error Line 168 exceeds the maximum line length of 100 max-len + 182:1 error Line 182 exceeds the maximum line length of 100 max-len + 196:1 error Line 196 exceeds the maximum line length of 100 max-len + 217:1 error Line 217 exceeds the maximum line length of 100 max-len + 231:1 error Line 231 exceeds the maximum line length of 100 max-len + 245:1 error Line 245 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack/jumpstart/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/jetpack/jumpstart/test/actions.js + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 127:1 error Line 127 exceeds the maximum line length of 100 max-len + 156:1 error Line 156 exceeds the maximum line length of 100 max-len + 198:1 error Line 198 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack/jumpstart/test/reducer.js + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 149:1 error Line 149 exceeds the maximum line length of 100 max-len + 166:1 error Line 166 exceeds the maximum line length of 100 max-len + 183:1 error Line 183 exceeds the maximum line length of 100 max-len + 200:1 error Line 200 exceeds the maximum line length of 100 max-len + 217:1 error Line 217 exceeds the maximum line length of 100 max-len + 234:1 error Line 234 exceeds the maximum line length of 100 max-len + 251:1 error Line 251 exceeds the maximum line length of 100 max-len + 268:1 error Line 268 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack/modules/test/actions.js + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 111:1 error Line 111 exceeds the maximum line length of 100 max-len + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + 163:1 error Line 163 exceeds the maximum line length of 100 max-len + 192:1 error Line 192 exceeds the maximum line length of 100 max-len + 201:1 error Line 201 exceeds the maximum line length of 100 max-len + 215:1 error Line 215 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack/modules/test/fixture/index.js + 37:14 error Identifier 'api_module_list_response' is not in camel case camelcase + 65:3 error Identifier 'module_tags' is not in camel case camelcase + 76:3 error Identifier 'module_tags' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack/modules/test/reducer.js + 170:1 error Line 170 exceeds the maximum line length of 100 max-len + 182:1 error Line 182 exceeds the maximum line length of 100 max-len + 194:1 error Line 194 exceeds the maximum line length of 100 max-len + 208:1 error Line 208 exceeds the maximum line length of 100 max-len + 220:1 error Line 220 exceeds the maximum line length of 100 max-len + 232:1 error Line 232 exceeds the maximum line length of 100 max-len + 246:1 error Line 246 exceeds the maximum line length of 100 max-len + 257:1 error Line 257 exceeds the maximum line length of 100 max-len + 269:1 error Line 269 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/jetpack/settings/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 114:38 error Identifier 'post_by_email_address' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack/settings/reducer.js + 95:6 error Identifier 'post_by_email_address' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack/settings/test/actions.js + 144:1 error Line 144 exceeds the maximum line length of 100 max-len + 174:1 error Line 174 exceeds the maximum line length of 100 max-len + 193:31 error Identifier 'post_by_email_address' is not in camel case camelcase + 199:9 error Identifier 'post_by_email_address' is not in camel case camelcase + 234:31 error Identifier 'post_by_email_address' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack/settings/test/fixture/index.js + 4:3 error Identifier 'setting_1' is not in camel case camelcase + 5:3 error Identifier 'setting_2' is not in camel case camelcase + 6:3 error Identifier 'setting_10' is not in camel case camelcase + 7:3 error Identifier 'wp_mobile_excerpt' is not in camel case camelcase + 8:3 error Identifier 'wp_mobile_featured_images' is not in camel case camelcase + 11:3 error Identifier 'setting_1' is not in camel case camelcase + 12:3 error Identifier 'setting_2' is not in camel case camelcase + 13:3 error Identifier 'setting_3' is not in camel case camelcase + 14:4 error Identifier 'setting_4' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack/settings/test/reducer.js + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + 94:49 error Identifier 'test_setting' is not in camel case camelcase + 98:48 error Identifier 'test_setting' is not in camel case camelcase + 110:18 error Identifier 'test_setting' is not in camel case camelcase + 114:48 error Identifier 'test_setting' is not in camel case camelcase + 122:7 error Identifier 'setting_123' is not in camel case camelcase + 134:6 error Identifier 'setting_123' is not in camel case camelcase + 144:7 error Identifier 'setting_123' is not in camel case camelcase + 156:6 error Identifier 'setting_123' is not in camel case camelcase + 166:7 error Identifier 'setting_123' is not in camel case camelcase + 186:6 error Identifier 'setting_123' is not in camel case camelcase + 193:1 error Line 193 exceeds the maximum line length of 100 max-len + 197:7 error Identifier 'setting_123' is not in camel case camelcase + 207:9 error Identifier 'wp_mobile_excerpt' is not in camel case camelcase + 208:10 error Identifier 'current_value' is not in camel case camelcase + 210:9 error Identifier 'some_other_option' is not in camel case camelcase + 211:10 error Identifier 'current_value' is not in camel case camelcase + 220:6 error Identifier 'setting_123' is not in camel case camelcase + 222:6 error Identifier 'wp_mobile_excerpt' is not in camel case camelcase + 223:6 error Identifier 'some_other_option' is not in camel case camelcase + 228:1 error Line 228 exceeds the maximum line length of 100 max-len + 232:7 error Identifier 'setting_123' is not in camel case camelcase + 233:7 error Identifier 'post_by_email_address' is not in camel case camelcase + 244:6 error Identifier 'setting_123' is not in camel case camelcase + 245:6 error Identifier 'post_by_email_address' is not in camel case camelcase + 286:1 error Line 286 exceeds the maximum line length of 100 max-len + 297:1 error Line 297 exceeds the maximum line length of 100 max-len + 319:1 error Line 319 exceeds the maximum line length of 100 max-len + 330:1 error Line 330 exceeds the maximum line length of 100 max-len + 341:1 error Line 341 exceeds the maximum line length of 100 max-len + 352:1 error Line 352 exceeds the maximum line length of 100 max-len + 364:1 error Line 364 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jetpack/settings/test/utils.js + 17:5 error Identifier 'some_random_setting' is not in camel case camelcase + 21:5 error Identifier 'some_random_setting' is not in camel case camelcase + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 27:5 error Identifier 'carousel_background_color' is not in camel case camelcase + 31:5 error Identifier 'carousel_background_color' is not in camel case camelcase + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 38:6 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 41:5 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 48:6 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 53:5 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 59:5 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 65:5 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 71:5 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 77:5 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 83:5 error Identifier 'some_setting' is not in camel case camelcase + 84:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 88:5 error Identifier 'some_setting' is not in camel case camelcase + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 94:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 99:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + 106:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 111:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 118:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 123:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 130:5 error Identifier 'some_other_setting' is not in camel case camelcase + 131:5 error Identifier 'jetpack_testimonial' is not in camel case camelcase + 132:5 error Identifier 'jetpack_testimonial_posts_per_page' is not in camel case camelcase + 133:5 error Identifier 'jetpack_portfolio' is not in camel case camelcase + 134:5 error Identifier 'jetpack_portfolio_posts_per_page' is not in camel case camelcase + 139:5 error Identifier 'some_other_setting' is not in camel case camelcase + 147:5 error Identifier 'some_random_setting' is not in camel case camelcase + 151:5 error Identifier 'some_random_setting' is not in camel case camelcase + 157:5 error Identifier 'some_other_setting' is not in camel case camelcase + 158:5 error Identifier 'post_by_email_address' is not in camel case camelcase + 162:5 error Identifier 'some_other_setting' is not in camel case camelcase + 168:5 error Identifier 'some_other_setting' is not in camel case camelcase + 173:5 error Identifier 'some_other_setting' is not in camel case camelcase + 179:5 error Identifier 'some_other_setting' is not in camel case camelcase + 184:5 error Identifier 'some_other_setting' is not in camel case camelcase + 190:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 199:1 error Line 199 exceeds the maximum line length of 100 max-len + 201:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 206:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 211:1 error Line 211 exceeds the maximum line length of 100 max-len + 213:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 218:5 error Identifier 'infinite_scroll' is not in camel case camelcase + 225:5 error Identifier 'some_other_setting' is not in camel case camelcase + 226:5 error Identifier 'jetpack_testimonial' is not in camel case camelcase + 227:5 error Identifier 'jetpack_testimonial_posts_per_page' is not in camel case camelcase + 228:5 error Identifier 'jetpack_portfolio' is not in camel case camelcase + 229:5 error Identifier 'jetpack_portfolio_posts_per_page' is not in camel case camelcase + 234:5 error Identifier 'some_other_setting' is not in camel case camelcase + 240:1 error Line 240 exceeds the maximum line length of 100 max-len + 242:5 error Identifier 'example_setting' is not in camel case camelcase + 244:5 error Identifier 'wp_mobile_excerpt' is not in camel case camelcase + 245:5 error Identifier 'wp_mobile_featured_images' is not in camel case camelcase + 246:5 error Identifier 'wp_mobile_app_promos' is not in camel case camelcase + 248:5 error Identifier 'stb_enabled' is not in camel case camelcase + 249:5 error Identifier 'stc_enabled' is not in camel case camelcase + 251:5 error Identifier 'social_notifications_like' is not in camel case camelcase + 252:5 error Identifier 'social_notifications_reblog' is not in camel case camelcase + 253:5 error Identifier 'social_notifications_subscribe' is not in camel case camelcase + 255:5 error Identifier 'wpcom_publish_comments_with_markdown' is not in camel case camelcase + 257:5 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 259:5 error Identifier 'jetpack_sso_match_by_email' is not in camel case camelcase + 260:5 error Identifier 'jetpack_sso_require_two_step' is not in camel case camelcase + 264:5 error Identifier 'guess_lang' is not in camel case camelcase + 275:5 error Identifier 'ignored_phrases' is not in camel case camelcase + 277:5 error Identifier 'highlander_comment_form_prompt' is not in camel case camelcase + 278:5 error Identifier 'jetpack_comment_form_color_scheme' is not in camel case camelcase + 280:5 error Identifier 'carousel_background_color' is not in camel case camelcase + 281:5 error Identifier 'carousel_display_exif' is not in camel case camelcase + 283:5 error Identifier 'admin_bar' is not in camel case camelcase + 284:5 error Identifier 'hide_smile' is not in camel case camelcase + 285:5 error Identifier 'count_roles' is not in camel case camelcase + 290:5 error Identifier 'example_setting' is not in camel case camelcase + 291:5 error Identifier 'wp_mobile_excerpt' is not in camel case camelcase + 292:5 error Identifier 'wp_mobile_featured_images' is not in camel case camelcase + 293:5 error Identifier 'wp_mobile_app_promos' is not in camel case camelcase + 294:5 error Identifier 'stb_enabled' is not in camel case camelcase + 295:5 error Identifier 'stc_enabled' is not in camel case camelcase + 296:5 error Identifier 'social_notifications_like' is not in camel case camelcase + 297:5 error Identifier 'social_notifications_reblog' is not in camel case camelcase + 298:5 error Identifier 'social_notifications_subscribe' is not in camel case camelcase + 299:5 error Identifier 'wpcom_publish_comments_with_markdown' is not in camel case camelcase + 300:5 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 301:5 error Identifier 'jetpack_sso_match_by_email' is not in camel case camelcase + 302:5 error Identifier 'jetpack_sso_require_two_step' is not in camel case camelcase + 305:5 error Identifier 'guess_lang' is not in camel case camelcase + 316:5 error Identifier 'ignored_phrases' is not in camel case camelcase + 317:5 error Identifier 'highlander_comment_form_prompt' is not in camel case camelcase + 318:5 error Identifier 'jetpack_comment_form_color_scheme' is not in camel case camelcase + 319:5 error Identifier 'carousel_background_color' is not in camel case camelcase + 320:5 error Identifier 'carousel_display_exif' is not in camel case camelcase + 321:5 error Identifier 'admin_bar' is not in camel case camelcase + 322:5 error Identifier 'hide_smile' is not in camel case camelcase + 323:5 error Identifier 'count_roles' is not in camel case camelcase + 330:5 error Identifier 'example_setting' is not in camel case camelcase + 332:5 error Identifier 'wp_mobile_excerpt' is not in camel case camelcase + 333:5 error Identifier 'wp_mobile_featured_images' is not in camel case camelcase + 334:5 error Identifier 'wp_mobile_app_promos' is not in camel case camelcase + 336:5 error Identifier 'stb_enabled' is not in camel case camelcase + 337:5 error Identifier 'stc_enabled' is not in camel case camelcase + 339:5 error Identifier 'social_notifications_like' is not in camel case camelcase + 340:5 error Identifier 'social_notifications_reblog' is not in camel case camelcase + 341:5 error Identifier 'social_notifications_subscribe' is not in camel case camelcase + 343:5 error Identifier 'wpcom_publish_comments_with_markdown' is not in camel case camelcase + 345:5 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 347:5 error Identifier 'jetpack_sso_match_by_email' is not in camel case camelcase + 348:5 error Identifier 'jetpack_sso_require_two_step' is not in camel case camelcase + 352:5 error Identifier 'guess_lang' is not in camel case camelcase + 363:5 error Identifier 'ignored_phrases' is not in camel case camelcase + 365:5 error Identifier 'highlander_comment_form_prompt' is not in camel case camelcase + 366:5 error Identifier 'jetpack_comment_form_color_scheme' is not in camel case camelcase + 368:5 error Identifier 'carousel_background_color' is not in camel case camelcase + 369:5 error Identifier 'carousel_display_exif' is not in camel case camelcase + 371:5 error Identifier 'admin_bar' is not in camel case camelcase + 372:5 error Identifier 'hide_smile' is not in camel case camelcase + 373:5 error Identifier 'count_roles' is not in camel case camelcase + 378:5 error Identifier 'example_setting' is not in camel case camelcase + 384:5 error Identifier 'example_setting' is not in camel case camelcase + 385:5 error Identifier 'wp_mobile_excerpt' is not in camel case camelcase + 386:5 error Identifier 'wp_mobile_featured_images' is not in camel case camelcase + 387:5 error Identifier 'wp_mobile_app_promos' is not in camel case camelcase + 388:5 error Identifier 'stb_enabled' is not in camel case camelcase + 389:5 error Identifier 'stc_enabled' is not in camel case camelcase + 390:5 error Identifier 'social_notifications_like' is not in camel case camelcase + 391:5 error Identifier 'social_notifications_reblog' is not in camel case camelcase + 392:5 error Identifier 'social_notifications_subscribe' is not in camel case camelcase + 393:5 error Identifier 'wpcom_publish_comments_with_markdown' is not in camel case camelcase + 394:5 error Identifier 'jetpack_protect_global_whitelist' is not in camel case camelcase + 395:5 error Identifier 'jetpack_sso_match_by_email' is not in camel case camelcase + 396:5 error Identifier 'jetpack_sso_require_two_step' is not in camel case camelcase + 399:5 error Identifier 'guess_lang' is not in camel case camelcase + 410:5 error Identifier 'ignored_phrases' is not in camel case camelcase + 411:5 error Identifier 'highlander_comment_form_prompt' is not in camel case camelcase + 412:5 error Identifier 'jetpack_comment_form_color_scheme' is not in camel case camelcase + 413:5 error Identifier 'carousel_background_color' is not in camel case camelcase + 414:5 error Identifier 'carousel_display_exif' is not in camel case camelcase + 415:5 error Identifier 'admin_bar' is not in camel case camelcase + 416:5 error Identifier 'hide_smile' is not in camel case camelcase + 417:5 error Identifier 'count_roles' is not in camel case camelcase + 422:5 error Identifier 'example_setting' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/jetpack/settings/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/jitm/selectors.js + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/lib/middleware.js + 38:1 error 'lib/sites-list' import is restricted from being used no-restricted-imports + +/Users/seear/repos/wp-calypso/client/state/login/actions.js + 61:2 error Identifier 'empty_password' is not in camel case camelcase + 62:2 error Identifier 'empty_two_step_code' is not in camel case camelcase + 63:2 error Identifier 'empty_username' is not in camel case camelcase + 64:2 error Identifier 'incorrect_password' is not in camel case camelcase + 65:2 error Identifier 'invalid_email' is not in camel case camelcase + 66:2 error Identifier 'invalid_two_step_code' is not in camel case camelcase + 67:2 error Identifier 'invalid_username' is not in camel case camelcase + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + 111:1 error Line 111 exceeds the maximum line length of 100 max-len + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + 124:1 error Line 124 exceeds the maximum line length of 100 max-len + 153:1 error Line 153 exceeds the maximum line length of 100 max-len + 189:4 error Identifier 'remember_me' is not in camel case camelcase + 190:4 error Identifier 'redirect_to' is not in camel case camelcase + 191:4 error Identifier 'client_id' is not in camel case camelcase + 192:4 error Identifier 'client_secret' is not in camel case camelcase + 248:4 error Identifier 'user_id' is not in camel case camelcase + 249:4 error Identifier 'auth_type' is not in camel case camelcase + 250:4 error Identifier 'two_step_code' is not in camel case camelcase + 251:4 error Identifier 'two_step_nonce' is not in camel case camelcase + 252:4 error Identifier 'remember_me' is not in camel case camelcase + 253:4 error Identifier 'client_id' is not in camel case camelcase + 254:4 error Identifier 'client_secret' is not in camel case camelcase + 287:1 error Line 287 exceeds the maximum line length of 100 max-len + 306:4 error Identifier 'redirect_to' is not in camel case camelcase + 307:4 error Identifier 'client_id' is not in camel case camelcase + 308:4 error Identifier 'client_secret' is not in camel case camelcase + 348:1 error Line 348 exceeds the maximum line length of 100 max-len + 362:37 error Identifier 'signup_flow_name' is not in camel case camelcase + 388:1 error Line 388 exceeds the maximum line length of 100 max-len + 391:1 error Line 391 exceeds the maximum line length of 100 max-len + 406:36 error Identifier 'redirect_to' is not in camel case camelcase + 411:6 error Identifier 'redirect_to' is not in camel case camelcase + 493:4 error Identifier 'user_id' is not in camel case camelcase + 494:4 error Identifier 'two_step_nonce' is not in camel case camelcase + 495:4 error Identifier 'client_id' is not in camel case camelcase + 496:4 error Identifier 'client_secret' is not in camel case camelcase + 551:4 error Identifier 'redirect_to' is not in camel case camelcase + 552:4 error Identifier 'client_id' is not in camel case camelcase + 553:4 error Identifier 'client_secret' is not in camel case camelcase + 554:4 error Identifier 'logout_nonce' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/login/magic-login/actions.js + 96:4 error Identifier 'client_id' is not in camel case camelcase + 97:4 error Identifier 'client_secret' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/login/magic-login/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/login/reducer.js + 131:1 error Line 131 exceeds the maximum line length of 100 max-len + 218:1 error Line 218 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/login/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/login/test/reducer.js + 175:3 error Test title is used multiple times in the same test suite jest/no-identical-title + 183:3 error Test title is used multiple times in the same test suite jest/no-identical-title + 505:5 error Identifier 'two_step_id' is not in camel case camelcase + 506:5 error Identifier 'two_step_nonce' is not in camel case camelcase + 525:1 error Line 525 exceeds the maximum line length of 100 max-len + 528:5 error Identifier 'two_step_id' is not in camel case camelcase + 529:5 error Identifier 'two_step_nonce' is not in camel case camelcase + 550:5 error Identifier 'two_step_id' is not in camel case camelcase + 551:5 error Identifier 'two_step_nonce_authenticator' is not in camel case camelcase + 561:5 error Identifier 'two_step_id' is not in camel case camelcase + 562:5 error Identifier 'two_step_nonce_authenticator' is not in camel case camelcase + 590:1 error Line 590 exceeds the maximum line length of 100 max-len + 592:5 error Identifier 'two_step_id' is not in camel case camelcase + 593:5 error Identifier 'two_step_nonce_sms' is not in camel case camelcase + 602:5 error Identifier 'two_step_id' is not in camel case camelcase + 603:5 error Identifier 'two_step_nonce_sms' is not in camel case camelcase + 607:1 error Line 607 exceeds the maximum line length of 100 max-len + 609:5 error Identifier 'two_step_id' is not in camel case camelcase + 610:5 error Identifier 'two_step_nonce_sms' is not in camel case camelcase + 619:5 error Identifier 'two_step_id' is not in camel case camelcase + 620:5 error Identifier 'two_step_nonce_sms' is not in camel case camelcase + 645:1 error Line 645 exceeds the maximum line length of 100 max-len + 683:23 error Identifier 'id_token' is not in camel case camelcase + 683:40 error Identifier 'access_token' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/login/test/selectors.js + 46:7 error Identifier 'user_id' is not in camel case camelcase + 67:8 error Identifier 'two_step_nonce_push' is not in camel case camelcase + 82:8 error Identifier 'two_step_nonce_sms' is not in camel case camelcase + 200:1 error Line 200 exceeds the maximum line length of 100 max-len + 204:7 error Identifier 'user_id' is not in camel case camelcase + 205:7 error Identifier 'two_step_nonce' is not in camel case camelcase + 223:7 error Identifier 'two_step_supported_auth_types' is not in camel case camelcase + 236:6 error Identifier 'two_step_supported_auth_types' is not in camel case camelcase + 245:1 error Line 245 exceeds the maximum line length of 100 max-len + 265:8 error Identifier 'push_web_token' is not in camel case camelcase + 336:5 error Identifier 'access_token' is not in camel case camelcase + 337:5 error Identifier 'id_token' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/notices/account-recovery/index.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + 114:1 error Line 114 exceeds the maximum line length of 100 max-len + 118:1 error Line 118 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/notices/jetpack-modules/index.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/notices/middleware.js + 256:1 error Line 256 exceeds the maximum line length of 100 max-len + 279:1 error Line 279 exceeds the maximum line length of 100 max-len + 280:1 error Line 280 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/notices/test/middleware.js + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 117:12 error Identifier 'site_ID' is not in camel case camelcase + 118:12 error Identifier 'global_ID' is not in camel case camelcase + 178:12 error Identifier 'site_ID' is not in camel case camelcase + 179:12 error Identifier 'global_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/notices/test/reducer.js + 95:1 error Line 95 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/notices/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/notification-settings/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/nps-survey/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/nps-survey/test/selectors.js + 91:1 error Line 91 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/oauth2-clients/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/oauth2-clients/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/oauth2-clients/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/oauth2-clients/test/reducer.js + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 80:1 error Line 80 exceeds the maximum line length of 100 max-len + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/page-templates/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/page-templates/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/page-templates/test/actions.js + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/pages/test/selectors.js + 24:10 error Identifier 'show_on_front' is not in camel case camelcase + 25:10 error Identifier 'page_on_front' is not in camel case camelcase + 47:10 error Identifier 'show_on_front' is not in camel case camelcase + 48:10 error Identifier 'page_on_front' is not in camel case camelcase + 70:10 error Identifier 'show_on_front' is not in camel case camelcase + 71:10 error Identifier 'page_on_front' is not in camel case camelcase + 109:10 error Identifier 'page_for_posts' is not in camel case camelcase + 131:10 error Identifier 'page_for_posts' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/plans/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/plans/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/plans/schema.js + 8:4 error Identifier 'android_sku' is not in camel case camelcase + 9:4 error Identifier 'apple_sku' is not in camel case camelcase + 11:4 error Identifier 'bill_period' is not in camel case camelcase + 12:4 error Identifier 'bill_period_label' is not in camel case camelcase + 13:4 error Identifier 'bundle_product_ids' is not in camel case camelcase + 16:4 error Identifier 'currency_code' is not in camel case camelcase + 18:4 error Identifier 'feature_1' is not in camel case camelcase + 19:4 error Identifier 'feature_2' is not in camel case camelcase + 20:4 error Identifier 'feature_3' is not in camel case camelcase + 21:4 error Identifier 'feature_4' is not in camel case camelcase + 22:4 error Identifier 'feature_5' is not in camel case camelcase + 23:4 error Identifier 'features_highlight' is not in camel case camelcase + 24:4 error Identifier 'formatted_price' is not in camel case camelcase + 25:4 error Identifier 'formatted_original_price' is not in camel case camelcase + 28:4 error Identifier 'icon_active' is not in camel case camelcase + 33:4 error Identifier 'product_id' is not in camel case camelcase + 34:4 error Identifier 'product_name' is not in camel case camelcase + 35:4 error Identifier 'product_name_en' is not in camel case camelcase + 36:4 error Identifier 'product_name_short' is not in camel case camelcase + 37:4 error Identifier 'product_slug' is not in camel case camelcase + 38:4 error Identifier 'product_type' is not in camel case camelcase + 39:4 error Identifier 'raw_price' is not in camel case camelcase + 43:4 error Identifier 'support_document' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/plans/selectors.js + 41:53 error Identifier 'product_id' is not in camel case camelcase + 52:52 error Identifier 'product_slug' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/plans/test/fixture/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 19:2 error Identifier 'product_id' is not in camel case camelcase + 20:2 error Identifier 'product_name' is not in camel case camelcase + 21:2 error Identifier 'product_name_en' is not in camel case camelcase + 23:2 error Identifier 'product_name_short' is not in camel case camelcase + 24:2 error Identifier 'product_slug' is not in camel case camelcase + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 31:2 error Identifier 'icon_active' is not in camel case camelcase + 34:2 error Identifier 'apple_sku' is not in camel case camelcase + 35:2 error Identifier 'android_sku' is not in camel case camelcase + 36:2 error Identifier 'bill_period' is not in camel case camelcase + 37:2 error Identifier 'product_type' is not in camel case camelcase + 40:2 error Identifier 'features_highlight' is not in camel case camelcase + 45:2 error Identifier 'bill_period_label' is not in camel case camelcase + 47:2 error Identifier 'formatted_price' is not in camel case camelcase + 48:2 error Identifier 'raw_price' is not in camel case camelcase + 52:2 error Identifier 'product_id' is not in camel case camelcase + 53:2 error Identifier 'product_name' is not in camel case camelcase + 54:2 error Identifier 'product_name_en' is not in camel case camelcase + 64:2 error Identifier 'product_name_short' is not in camel case camelcase + 65:2 error Identifier 'product_slug' is not in camel case camelcase + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + 74:2 error Identifier 'icon_active' is not in camel case camelcase + 77:2 error Identifier 'apple_sku' is not in camel case camelcase + 78:2 error Identifier 'android_sku' is not in camel case camelcase + 79:2 error Identifier 'bill_period' is not in camel case camelcase + 80:2 error Identifier 'product_type' is not in camel case camelcase + 83:2 error Identifier 'features_highlight' is not in camel case camelcase + 101:2 error Identifier 'support_document' is not in camel case camelcase + 102:2 error Identifier 'bundle_product_ids' is not in camel case camelcase + 130:2 error Identifier 'bill_period_label' is not in camel case camelcase + 132:2 error Identifier 'formatted_price' is not in camel case camelcase + 133:2 error Identifier 'raw_price' is not in camel case camelcase + 137:2 error Identifier 'product_id' is not in camel case camelcase + 138:2 error Identifier 'product_name' is not in camel case camelcase + 139:2 error Identifier 'product_name_en' is not in camel case camelcase + 149:2 error Identifier 'product_name_short' is not in camel case camelcase + 150:2 error Identifier 'product_slug' is not in camel case camelcase + 153:1 error Line 153 exceeds the maximum line length of 100 max-len + 162:1 error Line 162 exceeds the maximum line length of 100 max-len + 166:2 error Identifier 'icon_active' is not in camel case camelcase + 169:2 error Identifier 'apple_sku' is not in camel case camelcase + 170:2 error Identifier 'android_sku' is not in camel case camelcase + 171:2 error Identifier 'features_highlight' is not in camel case camelcase + 184:2 error Identifier 'bill_period' is not in camel case camelcase + 187:2 error Identifier 'product_type' is not in camel case camelcase + 189:2 error Identifier 'bundle_product_ids' is not in camel case camelcase + 219:2 error Identifier 'bill_period_label' is not in camel case camelcase + 221:2 error Identifier 'formatted_price' is not in camel case camelcase + 222:2 error Identifier 'raw_price' is not in camel case camelcase + 226:2 error Identifier 'product_id' is not in camel case camelcase + 227:2 error Identifier 'product_name' is not in camel case camelcase + 231:2 error Identifier 'product_name_short' is not in camel case camelcase + 232:2 error Identifier 'product_slug' is not in camel case camelcase + 236:2 error Identifier 'icon_active' is not in camel case camelcase + 239:2 error Identifier 'apple_sku' is not in camel case camelcase + 240:2 error Identifier 'android_sku' is not in camel case camelcase + 241:2 error Identifier 'features_highlight' is not in camel case camelcase + 250:2 error Identifier 'bill_period' is not in camel case camelcase + 251:2 error Identifier 'product_type' is not in camel case camelcase + 253:2 error Identifier 'bundle_product_ids' is not in camel case camelcase + 280:2 error Identifier 'bill_period_label' is not in camel case camelcase + 282:2 error Identifier 'formatted_price' is not in camel case camelcase + 283:2 error Identifier 'raw_price' is not in camel case camelcase + 284:2 error Identifier 'currency_code' is not in camel case camelcase + 288:2 error Identifier 'product_id' is not in camel case camelcase + 289:2 error Identifier 'product_name' is not in camel case camelcase + 290:2 error Identifier 'product_name_en' is not in camel case camelcase + 292:2 error Identifier 'product_name_short' is not in camel case camelcase + 293:2 error Identifier 'product_slug' is not in camel case camelcase + 296:1 error Line 296 exceeds the maximum line length of 100 max-len + 299:2 error Identifier 'icon_active' is not in camel case camelcase + 300:2 error Identifier 'feature_1' is not in camel case camelcase + 301:2 error Identifier 'feature_2' is not in camel case camelcase + 302:2 error Identifier 'feature_3' is not in camel case camelcase + 306:2 error Identifier 'apple_sku' is not in camel case camelcase + 307:2 error Identifier 'android_sku' is not in camel case camelcase + 308:2 error Identifier 'bill_period' is not in camel case camelcase + 309:2 error Identifier 'product_type' is not in camel case camelcase + 313:2 error Identifier 'bill_period_label' is not in camel case camelcase + 315:2 error Identifier 'formatted_price' is not in camel case camelcase + 316:2 error Identifier 'formatted_original_price' is not in camel case camelcase + 317:2 error Identifier 'raw_price' is not in camel case camelcase + 321:2 error Identifier 'product_id' is not in camel case camelcase + 322:2 error Identifier 'product_name' is not in camel case camelcase + 323:2 error Identifier 'product_name_en' is not in camel case camelcase + 325:2 error Identifier 'product_name_short' is not in camel case camelcase + 326:2 error Identifier 'product_slug' is not in camel case camelcase + 329:1 error Line 329 exceeds the maximum line length of 100 max-len + 332:2 error Identifier 'icon_active' is not in camel case camelcase + 333:2 error Identifier 'feature_1' is not in camel case camelcase + 334:2 error Identifier 'feature_2' is not in camel case camelcase + 335:2 error Identifier 'feature_3' is not in camel case camelcase + 339:2 error Identifier 'apple_sku' is not in camel case camelcase + 340:2 error Identifier 'android_sku' is not in camel case camelcase + 341:2 error Identifier 'bill_period' is not in camel case camelcase + 342:2 error Identifier 'product_type' is not in camel case camelcase + 346:2 error Identifier 'bill_period_label' is not in camel case camelcase + 348:2 error Identifier 'formatted_price' is not in camel case camelcase + 349:2 error Identifier 'formatted_original_price' is not in camel case camelcase + 350:2 error Identifier 'raw_price' is not in camel case camelcase + 354:2 error Identifier 'product_id' is not in camel case camelcase + 355:2 error Identifier 'product_name' is not in camel case camelcase + 356:2 error Identifier 'product_name_en' is not in camel case camelcase + 358:2 error Identifier 'product_name_short' is not in camel case camelcase + 359:2 error Identifier 'product_slug' is not in camel case camelcase + 362:1 error Line 362 exceeds the maximum line length of 100 max-len + 365:2 error Identifier 'icon_active' is not in camel case camelcase + 367:2 error Identifier 'apple_sku' is not in camel case camelcase + 368:2 error Identifier 'android_sku' is not in camel case camelcase + 369:2 error Identifier 'bill_period' is not in camel case camelcase + 370:2 error Identifier 'product_type' is not in camel case camelcase + 374:2 error Identifier 'bill_period_label' is not in camel case camelcase + 376:2 error Identifier 'formatted_price' is not in camel case camelcase + 377:2 error Identifier 'raw_price' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/plans/test/reducer.js + 103:22 error Identifier 'product_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/plans/test/selectors.js + 50:8 error Identifier 'product_id' is not in camel case camelcase + 51:8 error Identifier 'raw_price' is not in camel case camelcase + 64:8 error Identifier 'product_id' is not in camel case camelcase + 65:8 error Identifier 'raw_price' is not in camel case camelcase + 78:8 error Identifier 'product_id' is not in camel case camelcase + 79:8 error Identifier 'raw_price' is not in camel case camelcase + 92:8 error Identifier 'product_id' is not in camel case camelcase + 105:8 error Identifier 'product_id' is not in camel case camelcase + 106:8 error Identifier 'raw_price' is not in camel case camelcase + 122:8 error Identifier 'product_id' is not in camel case camelcase + 123:8 error Identifier 'product_slug' is not in camel case camelcase + 139:8 error Identifier 'product_id' is not in camel case camelcase + 140:8 error Identifier 'product_slug' is not in camel case camelcase + 156:8 error Identifier 'product_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/plugins/installed/actions.js + 191:1 error Line 191 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/installed/schema.js + 15:6 error Identifier 'plugin_url' is not in camel case camelcase + 19:6 error Identifier 'author_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/plugins/installed/status/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/installed/test/actions.js + 165:1 error Line 165 exceeds the maximum line length of 100 max-len + 166:1 error Line 166 exceeds the maximum line length of 100 max-len + 216:1 error Line 216 exceeds the maximum line length of 100 max-len + 217:1 error Line 217 exceeds the maximum line length of 100 max-len + 310:1 error Line 310 exceeds the maximum line length of 100 max-len + 325:5 error Identifier 'manage_options' is not in camel case camelcase + 356:1 error Line 356 exceeds the maximum line length of 100 max-len + 373:1 error Line 373 exceeds the maximum line length of 100 max-len + 409:5 error Identifier 'manage_options' is not in camel case camelcase + 436:1 error Line 436 exceeds the maximum line length of 100 max-len + 453:1 error Line 453 exceeds the maximum line length of 100 max-len + 473:5 error Identifier 'manage_options' is not in camel case camelcase + 508:1 error Line 508 exceeds the maximum line length of 100 max-len + 509:1 error Line 509 exceeds the maximum line length of 100 max-len + 542:5 error Identifier 'manage_options' is not in camel case camelcase + 578:1 error Line 578 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/installed/test/fixtures/plugins.js + 12:2 error Identifier 'plugin_url' is not in camel case camelcase + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + 17:2 error Identifier 'author_url' is not in camel case camelcase + 27:2 error Identifier 'plugin_url' is not in camel case camelcase + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 32:2 error Identifier 'author_url' is not in camel case camelcase + 42:2 error Identifier 'plugin_url' is not in camel case camelcase + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + 47:2 error Identifier 'author_url' is not in camel case camelcase + 54:3 error Identifier 'new_version' is not in camel case camelcase + 56:3 error Unquoted reserved word 'package' used as key quote-props + 71:2 error Identifier 'plugin_url' is not in camel case camelcase + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 76:2 error Identifier 'author_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/plugins/installed/test/reducer.js + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 94:1 error Line 94 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/installed/test/selectors.js + 132:1 error Line 132 exceeds the maximum line length of 100 max-len + 136:1 error Line 136 exceeds the maximum line length of 100 max-len + 139:1 error Line 139 exceeds the maximum line length of 100 max-len + 140:1 error Line 140 exceeds the maximum line length of 100 max-len + 143:1 error Line 143 exceeds the maximum line length of 100 max-len + 144:1 error Line 144 exceeds the maximum line length of 100 max-len + 174:1 error Line 174 exceeds the maximum line length of 100 max-len + 179:1 error Line 179 exceeds the maximum line length of 100 max-len + 198:1 error Line 198 exceeds the maximum line length of 100 max-len + 202:1 error Line 202 exceeds the maximum line length of 100 max-len + 218:1 error Line 218 exceeds the maximum line length of 100 max-len + 223:1 error Line 223 exceeds the maximum line length of 100 max-len + 230:1 error Line 230 exceeds the maximum line length of 100 max-len + 237:1 error Line 237 exceeds the maximum line length of 100 max-len + 251:1 error Line 251 exceeds the maximum line length of 100 max-len + 263:1 error Line 263 exceeds the maximum line length of 100 max-len + 266:1 error Line 266 exceeds the maximum line length of 100 max-len + 267:1 error Line 267 exceeds the maximum line length of 100 max-len + 282:1 error Line 282 exceeds the maximum line length of 100 max-len + 286:1 error Line 286 exceeds the maximum line length of 100 max-len + 290:1 error Line 290 exceeds the maximum line length of 100 max-len + 294:1 error Line 294 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/premium/actions.js + 224:4 error Identifier 'option_name' is not in camel case camelcase + 225:4 error Identifier 'option_value' is not in camel case camelcase + 226:4 error Identifier 'site_option' is not in camel case camelcase + 227:4 error Identifier 'is_array' is not in camel case camelcase + 269:17 error Identifier 'option_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/plugins/premium/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/plugins/premium/test/selectors.js + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + 112:1 error Line 112 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 116:3 error Test title is used multiple times in the same test suite jest/no-identical-title + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 132:1 error Line 132 exceeds the maximum line length of 100 max-len + 134:1 error Line 134 exceeds the maximum line length of 100 max-len + 143:1 error Line 143 exceeds the maximum line length of 100 max-len + 147:1 error Line 147 exceeds the maximum line length of 100 max-len + 151:1 error Line 151 exceeds the maximum line length of 100 max-len + 161:1 error Line 161 exceeds the maximum line length of 100 max-len + 165:1 error Line 165 exceeds the maximum line length of 100 max-len + 169:1 error Line 169 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/plugins/upload/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/plugins/upload/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/upload/test/reducer.js + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/wporg/actions.js + 21:5 error '_fetching' is never reassigned. Use 'const' instead prefer-const + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/wporg/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/plugins/wporg/selectors.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'state' valid-jsdoc + 1:1 error Missing JSDoc for parameter 'pluginSlug' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/plugins/wporg/test/actions.js + 22:4 warning Test is missing function argument jest/no-disabled-tests + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/wporg/test/reducer.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/plugins/wporg/test/selectors.js + 46:8 error 'plugin' is never reassigned. Use 'const' instead prefer-const + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/post-formats/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/post-formats/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/post-types/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/post-types/schema.js + 16:6 error Identifier 'map_meta_cap' is not in camel case camelcase + 18:6 error Identifier 'api_queryable' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/post-types/taxonomies/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/post-types/taxonomies/schema.js + 23:9 error Unquoted reserved word 'public' used as key quote-props + +/Users/seear/repos/wp-calypso/client/state/post-types/taxonomies/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/post-types/taxonomies/test/reducer.js + 177:7 error Identifier 'post_tag' is not in camel case camelcase + 216:7 error Identifier 'post_tag' is not in camel case camelcase + 236:7 error Identifier 'post_tag' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/post-types/taxonomies/test/selectors.js + 127:11 error Identifier 'post_tag' is not in camel case camelcase + 178:11 error Identifier 'post_tag' is not in camel case camelcase + 208:11 error Identifier 'post_tag' is not in camel case camelcase + 238:11 error Identifier 'post_tag' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/post-types/test/actions.js + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 46:6 error Identifier 'post_types' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/posts/constants.js + 4:2 error Identifier 'http_envelope' is not in camel case camelcase + 10:2 error Identifier 'order_by' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/posts/counts/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/posts/counts/reducer.js + 161:1 error Line 161 exceeds the maximum line length of 100 max-len + 179:1 error Line 179 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/posts/counts/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/posts/counts/test/reducer.js + 263:1 error Line 263 exceeds the maximum line length of 100 max-len + 263:17 error Identifier 'site_ID' is not in camel case camelcase + 302:1 error Line 302 exceeds the maximum line length of 100 max-len + 302:16 error Identifier 'site_ID' is not in camel case camelcase + 319:1 error Line 319 exceeds the maximum line length of 100 max-len + 319:16 error Identifier 'site_ID' is not in camel case camelcase + 337:1 error Line 337 exceeds the maximum line length of 100 max-len + 337:16 error Identifier 'site_ID' is not in camel case camelcase + 382:1 error Line 382 exceeds the maximum line length of 100 max-len + 382:16 error Identifier 'site_ID' is not in camel case camelcase + 389:1 error Line 389 exceeds the maximum line length of 100 max-len + 389:16 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/posts/counts/test/selectors.js + 165:1 error Line 165 exceeds the maximum line length of 100 max-len + 279:1 error Line 279 exceeds the maximum line length of 100 max-len + 318:12 error Unquoted reserved word 'private' used as key quote-props + +/Users/seear/repos/wp-calypso/client/state/posts/likes/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/posts/likes/schema.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/posts/likes/test/actions.js + 33:6 error Identifier 'i_like' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/posts/reducer.js + 214:1 error Line 214 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/posts/revisions/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/posts/selectors.js + 383:1 error Line 383 exceeds the maximum line length of 100 max-len + 486:11 error Identifier 'is_mapped_domain' is not in camel case camelcase + 486:29 error Identifier 'unmapped_url' is not in camel case camelcase + 487:16 error Identifier 'is_mapped_domain' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/posts/test/actions.js + 101:1 error Line 101 exceeds the maximum line length of 100 max-len + 130:1 error Line 130 exceeds the maximum line length of 100 max-len + 142:1 error Line 142 exceeds the maximum line length of 100 max-len + 178:1 error Line 178 exceeds the maximum line length of 100 max-len + 186:1 error Line 186 exceeds the maximum line length of 100 max-len + 322:1 error Line 322 exceeds the maximum line length of 100 max-len + 364:1 error Line 364 exceeds the maximum line length of 100 max-len + 379:1 error Line 379 exceeds the maximum line length of 100 max-len + 539:4 error Identifier 'site_ID' is not in camel case camelcase + 540:4 error Identifier 'global_ID' is not in camel case camelcase + 595:1 error Line 595 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/posts/test/reducer.js + 68:7 error Identifier 'site_ID' is not in camel case camelcase + 69:7 error Identifier 'global_ID' is not in camel case camelcase + 74:7 error Identifier 'site_ID' is not in camel case camelcase + 75:7 error Identifier 'global_ID' is not in camel case camelcase + 96:7 error Identifier 'site_ID' is not in camel case camelcase + 97:7 error Identifier 'global_ID' is not in camel case camelcase + 144:6 error Identifier 'site_ID' is not in camel case camelcase + 145:6 error Identifier 'global_ID' is not in camel case camelcase + 211:7 error Identifier 'site_ID' is not in camel case camelcase + 212:7 error Identifier 'global_ID' is not in camel case camelcase + 253:7 error Identifier 'site_ID' is not in camel case camelcase + 254:7 error Identifier 'global_ID' is not in camel case camelcase + 266:6 error Identifier 'site_ID' is not in camel case camelcase + 267:6 error Identifier 'global_ID' is not in camel case camelcase + 283:8 error Identifier 'site_ID' is not in camel case camelcase + 284:8 error Identifier 'global_ID' is not in camel case camelcase + 300:7 error Identifier 'site_ID' is not in camel case camelcase + 301:7 error Identifier 'global_ID' is not in camel case camelcase + 324:7 error Identifier 'site_ID' is not in camel case camelcase + 325:7 error Identifier 'global_ID' is not in camel case camelcase + 341:5 error Identifier 'site_ID' is not in camel case camelcase + 342:5 error Identifier 'global_ID' is not in camel case camelcase + 365:8 error Identifier 'site_ID' is not in camel case camelcase + 366:8 error Identifier 'global_ID' is not in camel case camelcase + 380:7 error Identifier 'site_ID' is not in camel case camelcase + 381:7 error Identifier 'global_ID' is not in camel case camelcase + 391:5 error Identifier 'site_ID' is not in camel case camelcase + 392:5 error Identifier 'global_ID' is not in camel case camelcase + 409:7 error Identifier 'site_ID' is not in camel case camelcase + 410:7 error Identifier 'global_ID' is not in camel case camelcase + 438:7 error Identifier 'site_ID' is not in camel case camelcase + 439:7 error Identifier 'global_ID' is not in camel case camelcase + 473:8 error Identifier 'site_ID' is not in camel case camelcase + 474:8 error Identifier 'global_ID' is not in camel case camelcase + 494:5 error Identifier 'site_ID' is not in camel case camelcase + 495:5 error Identifier 'global_ID' is not in camel case camelcase + 512:7 error Identifier 'site_ID' is not in camel case camelcase + 513:7 error Identifier 'global_ID' is not in camel case camelcase + 541:7 error Identifier 'site_ID' is not in camel case camelcase + 542:7 error Identifier 'global_ID' is not in camel case camelcase + 577:8 error Identifier 'site_ID' is not in camel case camelcase + 578:8 error Identifier 'global_ID' is not in camel case camelcase + 606:8 error Identifier 'site_ID' is not in camel case camelcase + 607:8 error Identifier 'global_ID' is not in camel case camelcase + 622:9 error Identifier 'site_ID' is not in camel case camelcase + 623:9 error Identifier 'global_ID' is not in camel case camelcase + 648:9 error Identifier 'site_ID' is not in camel case camelcase + 649:9 error Identifier 'global_ID' is not in camel case camelcase + 673:8 error Identifier 'global_ID' is not in camel case camelcase + 674:8 error Identifier 'site_ID' is not in camel case camelcase + 918:9 error Identifier 'comments_open' is not in camel case camelcase + 928:8 error Identifier 'pings_open' is not in camel case camelcase + 939:8 error Identifier 'comments_open' is not in camel case camelcase + 940:8 error Identifier 'pings_open' is not in camel case camelcase + 962:26 error Identifier 'site_ID' is not in camel case camelcase + 986:9 error Identifier 'post_tag' is not in camel case camelcase + 1005:8 error Identifier 'site_ID' is not in camel case camelcase + 1009:9 error Identifier 'post_tag' is not in camel case camelcase + 1051:9 error Identifier 'post_tag' is not in camel case camelcase + 1070:8 error Identifier 'site_ID' is not in camel case camelcase + 1074:9 error Identifier 'post_tag' is not in camel case camelcase + 1096:8 error Identifier 'post_tag' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/posts/test/selectors.js + 85:5 error Identifier 'site_ID' is not in camel case camelcase + 86:5 error Identifier 'global_ID' is not in camel case camelcase + 127:5 error Identifier 'site_ID' is not in camel case camelcase + 128:5 error Identifier 'global_ID' is not in camel case camelcase + 133:5 error Identifier 'post_thumbnail' is not in camel case camelcase + 163:5 error Identifier 'canonical_image' is not in camel case camelcase + 178:7 error Identifier 'site_ID' is not in camel case camelcase + 179:7 error Identifier 'global_ID' is not in camel case camelcase + 184:7 error Identifier 'site_ID' is not in camel case camelcase + 185:7 error Identifier 'global_ID' is not in camel case camelcase + 192:7 error Identifier 'site_ID' is not in camel case camelcase + 193:7 error Identifier 'global_ID' is not in camel case camelcase + 211:1 error Line 211 exceeds the maximum line length of 100 max-len + 233:5 error Identifier 'site_ID' is not in camel case camelcase + 234:5 error Identifier 'global_ID' is not in camel case camelcase + 298:11 error Identifier 'site_ID' is not in camel case camelcase + 299:11 error Identifier 'global_ID' is not in camel case camelcase + 319:6 error Identifier 'site_ID' is not in camel case camelcase + 320:6 error Identifier 'global_ID' is not in camel case camelcase + 326:1 error Line 326 exceeds the maximum line length of 100 max-len + 335:11 error Identifier 'site_ID' is not in camel case camelcase + 336:11 error Identifier 'global_ID' is not in camel case camelcase + 405:1 error Line 405 exceeds the maximum line length of 100 max-len + 446:11 error Identifier 'site_ID' is not in camel case camelcase + 447:11 error Identifier 'global_ID' is not in camel case camelcase + 517:11 error Identifier 'site_ID' is not in camel case camelcase + 518:11 error Identifier 'global_ID' is not in camel case camelcase + 539:1 error Line 539 exceeds the maximum line length of 100 max-len + 548:11 error Identifier 'site_ID' is not in camel case camelcase + 549:11 error Identifier 'global_ID' is not in camel case camelcase + 619:11 error Identifier 'site_ID' is not in camel case camelcase + 620:11 error Identifier 'global_ID' is not in camel case camelcase + 650:11 error Identifier 'site_ID' is not in camel case camelcase + 651:11 error Identifier 'global_ID' is not in camel case camelcase + 681:11 error Identifier 'site_ID' is not in camel case camelcase + 682:11 error Identifier 'global_ID' is not in camel case camelcase + 747:9 error Identifier 'site_ID' is not in camel case camelcase + 748:9 error Identifier 'global_ID' is not in camel case camelcase + 753:9 error Identifier 'site_ID' is not in camel case camelcase + 754:9 error Identifier 'global_ID' is not in camel case camelcase + 763:11 error Identifier 'site_ID' is not in camel case camelcase + 764:11 error Identifier 'global_ID' is not in camel case camelcase + 769:11 error Identifier 'site_ID' is not in camel case camelcase + 770:11 error Identifier 'global_ID' is not in camel case camelcase + 790:6 error Identifier 'site_ID' is not in camel case camelcase + 791:6 error Identifier 'global_ID' is not in camel case camelcase + 796:6 error Identifier 'site_ID' is not in camel case camelcase + 797:6 error Identifier 'global_ID' is not in camel case camelcase + 810:9 error Identifier 'site_ID' is not in camel case camelcase + 811:9 error Identifier 'global_ID' is not in camel case camelcase + 820:11 error Identifier 'site_ID' is not in camel case camelcase + 821:11 error Identifier 'global_ID' is not in camel case camelcase + 842:6 error Identifier 'site_ID' is not in camel case camelcase + 843:6 error Identifier 'global_ID' is not in camel case camelcase + 938:5 error Identifier 'site_ID' is not in camel case camelcase + 939:5 error Identifier 'global_ID' is not in camel case camelcase + 1009:5 error Identifier 'site_ID' is not in camel case camelcase + 1010:5 error Identifier 'global_ID' is not in camel case camelcase + 1046:5 error Identifier 'site_ID' is not in camel case camelcase + 1047:5 error Identifier 'global_ID' is not in camel case camelcase + 1049:6 error Identifier 'comments_open' is not in camel case camelcase + 1067:11 error Identifier 'pings_open' is not in camel case camelcase + 1081:6 error Identifier 'comments_open' is not in camel case camelcase + 1082:6 error Identifier 'pings_open' is not in camel case camelcase + 1102:11 error Identifier 'site_ID' is not in camel case camelcase + 1103:11 error Identifier 'global_ID' is not in camel case camelcase + 1105:12 error Identifier 'post_tag' is not in camel case camelcase + 1122:11 error Identifier 'post_tag' is not in camel case camelcase + 1135:5 error Identifier 'site_ID' is not in camel case camelcase + 1136:5 error Identifier 'global_ID' is not in camel case camelcase + 1138:6 error Identifier 'post_tag' is not in camel case camelcase + 1160:11 error Identifier 'site_ID' is not in camel case camelcase + 1161:11 error Identifier 'global_ID' is not in camel case camelcase + 1163:12 error Identifier 'post_tag' is not in camel case camelcase + 1177:11 error Identifier 'post_tag' is not in camel case camelcase + 1190:5 error Identifier 'site_ID' is not in camel case camelcase + 1191:5 error Identifier 'global_ID' is not in camel case camelcase + 1193:6 error Identifier 'post_tag' is not in camel case camelcase + 1304:5 error Identifier 'site_ID' is not in camel case camelcase + 1305:5 error Identifier 'global_ID' is not in camel case camelcase + 1339:5 error Identifier 'site_ID' is not in camel case camelcase + 1340:5 error Identifier 'global_ID' is not in camel case camelcase + 1342:6 error Identifier 'comments_open' is not in camel case camelcase + 1360:11 error Identifier 'pings_open' is not in camel case camelcase + 1396:5 error Identifier 'site_ID' is not in camel case camelcase + 1397:5 error Identifier 'global_ID' is not in camel case camelcase + 1431:5 error Identifier 'site_ID' is not in camel case camelcase + 1432:5 error Identifier 'global_ID' is not in camel case camelcase + 1466:5 error Identifier 'site_ID' is not in camel case camelcase + 1467:5 error Identifier 'global_ID' is not in camel case camelcase + 1519:5 error Identifier 'site_ID' is not in camel case camelcase + 1520:5 error Identifier 'global_ID' is not in camel case camelcase + 1554:5 error Identifier 'site_ID' is not in camel case camelcase + 1555:5 error Identifier 'global_ID' is not in camel case camelcase + 1589:5 error Identifier 'site_ID' is not in camel case camelcase + 1590:5 error Identifier 'global_ID' is not in camel case camelcase + 1636:11 error Identifier 'site_ID' is not in camel case camelcase + 1637:11 error Identifier 'global_ID' is not in camel case camelcase + 1661:11 error Identifier 'site_ID' is not in camel case camelcase + 1662:11 error Identifier 'global_ID' is not in camel case camelcase + 1724:1 error Line 1724 exceeds the maximum line length of 100 max-len + 1773:11 error Identifier 'site_ID' is not in camel case camelcase + 1774:11 error Identifier 'global_ID' is not in camel case camelcase + 1805:11 error Identifier 'site_ID' is not in camel case camelcase + 1806:11 error Identifier 'global_ID' is not in camel case camelcase + 1858:11 error Identifier 'site_ID' is not in camel case camelcase + 1859:11 error Identifier 'global_ID' is not in camel case camelcase + 1886:11 error Identifier 'site_ID' is not in camel case camelcase + 1887:11 error Identifier 'global_ID' is not in camel case camelcase + 1916:11 error Identifier 'site_ID' is not in camel case camelcase + 1917:11 error Identifier 'global_ID' is not in camel case camelcase + 1920:11 error Identifier 'preview_URL' is not in camel case camelcase + 1947:11 error Identifier 'site_ID' is not in camel case camelcase + 1948:11 error Identifier 'global_ID' is not in camel case camelcase + 1977:11 error Identifier 'site_ID' is not in camel case camelcase + 1978:11 error Identifier 'global_ID' is not in camel case camelcase + 1992:10 error Identifier 'unmapped_url' is not in camel case camelcase + 1993:10 error Identifier 'is_mapped_domain' is not in camel case camelcase + 2019:11 error Identifier 'site_ID' is not in camel case camelcase + 2020:11 error Identifier 'global_ID' is not in camel case camelcase + 2036:1 error Line 2036 exceeds the maximum line length of 100 max-len + 2064:11 error Identifier 'site_ID' is not in camel case camelcase + 2065:11 error Identifier 'global_ID' is not in camel case camelcase + 2089:11 error Identifier 'site_ID' is not in camel case camelcase + 2090:11 error Identifier 'global_ID' is not in camel case camelcase + 2114:11 error Identifier 'site_ID' is not in camel case camelcase + 2115:11 error Identifier 'global_ID' is not in camel case camelcase + 2141:11 error Identifier 'site_ID' is not in camel case camelcase + 2142:11 error Identifier 'global_ID' is not in camel case camelcase + 2169:11 error Identifier 'site_ID' is not in camel case camelcase + 2170:11 error Identifier 'global_ID' is not in camel case camelcase + 2211:11 error Identifier 'site_ID' is not in camel case camelcase + 2212:11 error Identifier 'global_ID' is not in camel case camelcase + 2238:11 error Identifier 'site_ID' is not in camel case camelcase + 2239:11 error Identifier 'global_ID' is not in camel case camelcase + 2241:1 error Line 2241 exceeds the maximum line length of 100 max-len + 2256:1 error Line 2256 exceeds the maximum line length of 100 max-len + 2265:11 error Identifier 'site_ID' is not in camel case camelcase + 2266:11 error Identifier 'global_ID' is not in camel case camelcase + 2268:1 error Line 2268 exceeds the maximum line length of 100 max-len + 2294:11 error Identifier 'site_ID' is not in camel case camelcase + 2295:11 error Identifier 'global_ID' is not in camel case camelcase + 2321:11 error Identifier 'site_ID' is not in camel case camelcase + 2322:11 error Identifier 'global_ID' is not in camel case camelcase + 2325:11 error Identifier 'other_URLs' is not in camel case camelcase + 2326:12 error Identifier 'suggested_slug' is not in camel case camelcase + 2357:11 error Identifier 'site_ID' is not in camel case camelcase + 2358:11 error Identifier 'global_ID' is not in camel case camelcase + 2360:11 error Identifier 'other_URLs' is not in camel case camelcase + 2361:12 error Identifier 'suggested_slug' is not in camel case camelcase + 2386:11 error Identifier 'site_ID' is not in camel case camelcase + 2387:11 error Identifier 'global_ID' is not in camel case camelcase + 2389:11 error Identifier 'other_URLs' is not in camel case camelcase + 2390:12 error Identifier 'suggested_slug' is not in camel case camelcase + 2416:11 error Identifier 'site_ID' is not in camel case camelcase + 2417:11 error Identifier 'global_ID' is not in camel case camelcase + 2419:11 error Identifier 'other_URLs' is not in camel case camelcase + 2420:12 error Identifier 'suggested_slug' is not in camel case camelcase + 2452:11 error Identifier 'site_ID' is not in camel case camelcase + 2453:11 error Identifier 'global_ID' is not in camel case camelcase + 2455:11 error Identifier 'other_URLs' is not in camel case camelcase + 2456:12 error Identifier 'suggested_slug' is not in camel case camelcase + 2486:7 error Identifier 'site_ID' is not in camel case camelcase + 2487:7 error Identifier 'global_ID' is not in camel case camelcase + 2495:7 error Identifier 'site_ID' is not in camel case camelcase + 2496:7 error Identifier 'global_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/posts/test/utils.js + 30:6 error Identifier 'post_tag' is not in camel case camelcase + 39:6 error Identifier 'post_tag' is not in camel case camelcase + 63:6 error Identifier 'post_tag' is not in camel case camelcase + 72:6 error Identifier 'post_tag' is not in camel case camelcase + 96:6 error Identifier 'post_tag' is not in camel case camelcase + 113:5 error Identifier 'site_ID' is not in camel case camelcase + 114:5 error Identifier 'global_ID' is not in camel case camelcase + 118:6 error Identifier 'post_tag' is not in camel case camelcase + 125:5 error Identifier 'site_ID' is not in camel case camelcase + 126:5 error Identifier 'global_ID' is not in camel case camelcase + 129:6 error Identifier 'post_tag' is not in camel case camelcase + 144:5 error Identifier 'site_ID' is not in camel case camelcase + 145:5 error Identifier 'global_ID' is not in camel case camelcase + 150:5 error Identifier 'post_thumbnail' is not in camel case camelcase + 164:5 error Identifier 'canonical_image' is not in camel case camelcase + 186:6 error Identifier 'post_tag' is not in camel case camelcase + 227:6 error Identifier 'post_tag' is not in camel case camelcase + 347:6 error Identifier 'tags_by_id' is not in camel case camelcase + 352:5 error Identifier 'tags_by_id' is not in camel case camelcase + 359:6 error Identifier 'tags_by_id' is not in camel case camelcase + 365:5 error Identifier 'tags_by_id' is not in camel case camelcase + 373:6 error Identifier 'tags_by_id' is not in camel case camelcase + 376:6 error Identifier 'tags_by_id' is not in camel case camelcase + 381:5 error Identifier 'tags_by_id' is not in camel case camelcase + 389:6 error Identifier 'tags_by_id' is not in camel case camelcase + 392:6 error Identifier 'tags_by_id' is not in camel case camelcase + 397:5 error Identifier 'tags_by_id' is not in camel case camelcase + 417:6 error Identifier 'wookie_post_types' is not in camel case camelcase + 431:6 error Identifier 'wookie_post_types' is not in camel case camelcase + 438:5 error Identifier 'terms_by_id' is not in camel case camelcase + 439:6 error Identifier 'wookie_post_types' is not in camel case camelcase + 448:6 error Identifier 'wookie_post_types' is not in camel case camelcase + 455:6 error Identifier 'wookie_post_types' is not in camel case camelcase + 457:5 error Identifier 'terms_by_id' is not in camel case camelcase + 458:6 error Identifier 'wookie_post_types' is not in camel case camelcase + 467:6 error Identifier 'wookie_post_tags' is not in camel case camelcase + 474:6 error Identifier 'wookie_post_tags' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/posts/utils.js + 228:3 error Identifier 'terms_by_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/preferences/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/preferences/schema.js + 12:4 error Unquoted reserved word 'enum' used as key quote-props + 62:4 error Unquoted reserved word 'enum' used as key quote-props + +/Users/seear/repos/wp-calypso/client/state/preferences/selectors.js + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/preferences/test/actions.js + 76:2 error Test suite title is used multiple times jest/no-identical-title + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 157:1 error Line 157 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/preferences/test/selectors.js + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/preview/actions.js + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + 23:14 error Identifier 'show_on_front' is not in camel case camelcase + 25:15 error Identifier 'page_on_front' is not in camel case camelcase + 28:15 error Identifier 'page_for_posts' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/preview/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/preview/save-functions/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/preview/save-functions/index.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/preview/schema.js + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/preview/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/products-list/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/products-list/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/products-list/schema.js + 19:5 error Identifier 'product_id' is not in camel case camelcase + 20:5 error Identifier 'product_name' is not in camel case camelcase + 21:5 error Identifier 'product_slug' is not in camel case camelcase + 27:5 error Identifier 'is_domain_registration' is not in camel case camelcase + 28:5 error Identifier 'cost_display' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/products-list/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/products-list/test/actions.js + 26:8 error Identifier 'guided_transfer' is not in camel case camelcase + 27:3 error Identifier 'product_id' is not in camel case camelcase + 28:3 error Identifier 'product_name' is not in camel case camelcase + 29:3 error Identifier 'product_slug' is not in camel case camelcase + 31:3 error Identifier 'is_domain_registration' is not in camel case camelcase + 34:3 error Identifier 'cost_display' is not in camel case camelcase + 39:42 error Identifier 'guided_transfer' is not in camel case camelcase + 39:42 error Identifier 'guided_transfer' is not in camel case camelcase + 43:21 error Identifier 'guided_transfer' is not in camel case camelcase + 43:21 error Identifier 'guided_transfer' is not in camel case camelcase + 53:20 error Identifier 'guided_transfer' is not in camel case camelcase + 53:20 error Identifier 'guided_transfer' is not in camel case camelcase + 71:22 error Identifier 'guided_transfer' is not in camel case camelcase + 71:22 error Identifier 'guided_transfer' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/products-list/test/reducer.js + 41:6 error Identifier 'guided_transfer' is not in camel case camelcase + 43:7 error Identifier 'product_id' is not in camel case camelcase + 44:7 error Identifier 'product_name' is not in camel case camelcase + 45:7 error Identifier 'product_slug' is not in camel case camelcase + 47:7 error Identifier 'is_domain_registration' is not in camel case camelcase + 50:7 error Identifier 'cost_display' is not in camel case camelcase + 69:6 error Identifier 'guided_transfer' is not in camel case camelcase + 71:7 error Identifier 'product_id' is not in camel case camelcase + 72:7 error Identifier 'product_name' is not in camel case camelcase + 73:7 error Identifier 'product_slug' is not in camel case camelcase + 75:7 error Identifier 'is_domain_registration' is not in camel case camelcase + 78:7 error Identifier 'cost_display' is not in camel case camelcase + 87:6 error Identifier 'guided_transfer' is not in camel case camelcase + 89:7 error Identifier 'product_id' is not in camel case camelcase + 90:7 error Identifier 'product_name' is not in camel case camelcase + 91:7 error Identifier 'product_slug' is not in camel case camelcase + 93:7 error Identifier 'is_domain_registration' is not in camel case camelcase + 96:7 error Identifier 'cost_display' is not in camel case camelcase + 105:6 error Identifier 'guided_transfer' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/products-list/test/selectors.js + 26:7 error Identifier 'guided_transfer' is not in camel case camelcase + 27:8 error Identifier 'cost_display' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/purchases/actions.js + 3:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/purchases/reducer.js + 100:17 error Identifier 'blog_id' is not in camel case camelcase + 107:17 error Identifier 'user_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/purchases/selectors.js + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/purchases/test/reducer.js + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 51:16 error Identifier 'blog_id' is not in camel case camelcase + 51:33 error Identifier 'user_id' is not in camel case camelcase + 52:16 error Identifier 'blog_id' is not in camel case camelcase + 52:33 error Identifier 'user_id' is not in camel case camelcase + 59:16 error Identifier 'blog_id' is not in camel case camelcase + 59:33 error Identifier 'user_id' is not in camel case camelcase + 60:16 error Identifier 'blog_id' is not in camel case camelcase + 60:33 error Identifier 'user_id' is not in camel case camelcase + 66:16 error Identifier 'blog_id' is not in camel case camelcase + 66:33 error Identifier 'user_id' is not in camel case camelcase + 67:16 error Identifier 'blog_id' is not in camel case camelcase + 67:33 error Identifier 'user_id' is not in camel case camelcase + 68:16 error Identifier 'blog_id' is not in camel case camelcase + 68:33 error Identifier 'user_id' is not in camel case camelcase + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 81:16 error Identifier 'blog_id' is not in camel case camelcase + 81:33 error Identifier 'user_id' is not in camel case camelcase + 82:16 error Identifier 'blog_id' is not in camel case camelcase + 82:33 error Identifier 'user_id' is not in camel case camelcase + 83:16 error Identifier 'blog_id' is not in camel case camelcase + 83:33 error Identifier 'user_id' is not in camel case camelcase + 92:34 error Identifier 'blog_id' is not in camel case camelcase + 92:49 error Identifier 'user_id' is not in camel case camelcase + 97:16 error Identifier 'blog_id' is not in camel case camelcase + 97:33 error Identifier 'user_id' is not in camel case camelcase + 98:16 error Identifier 'blog_id' is not in camel case camelcase + 98:33 error Identifier 'user_id' is not in camel case camelcase + 106:16 error Identifier 'blog_id' is not in camel case camelcase + 106:33 error Identifier 'user_id' is not in camel case camelcase + 107:16 error Identifier 'blog_id' is not in camel case camelcase + 107:33 error Identifier 'user_id' is not in camel case camelcase + 119:28 error Identifier 'blog_id' is not in camel case camelcase + 119:45 error Identifier 'user_id' is not in camel case camelcase + 125:16 error Identifier 'blog_id' is not in camel case camelcase + 125:33 error Identifier 'user_id' is not in camel case camelcase + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + 126:16 error Identifier 'blog_id' is not in camel case camelcase + 126:31 error Identifier 'user_id' is not in camel case camelcase + 142:23 error Identifier 'blog_id' is not in camel case camelcase + 142:40 error Identifier 'user_id' is not in camel case camelcase + 151:1 error Line 151 exceeds the maximum line length of 100 max-len + 154:16 error Identifier 'blog_id' is not in camel case camelcase + 154:33 error Identifier 'user_id' is not in camel case camelcase + 155:16 error Identifier 'blog_id' is not in camel case camelcase + 155:31 error Identifier 'user_id' is not in camel case camelcase + 174:6 error Identifier 'blog_id' is not in camel case camelcase + 175:6 error Identifier 'user_id' is not in camel case camelcase + 180:6 error Identifier 'blog_id' is not in camel case camelcase + 181:6 error Identifier 'user_id' is not in camel case camelcase + 192:1 error Line 192 exceeds the maximum line length of 100 max-len + 195:16 error Identifier 'blog_id' is not in camel case camelcase + 195:33 error Identifier 'user_id' is not in camel case camelcase + 196:16 error Identifier 'blog_id' is not in camel case camelcase + 196:31 error Identifier 'user_id' is not in camel case camelcase + 209:5 error Identifier 'blog_id' is not in camel case camelcase + 210:5 error Identifier 'user_id' is not in camel case camelcase + 213:5 error Identifier 'has_private_registration' is not in camel case camelcase + 221:6 error Identifier 'blog_id' is not in camel case camelcase + 222:6 error Identifier 'user_id' is not in camel case camelcase + 225:6 error Identifier 'has_private_registration' is not in camel case camelcase + 229:6 error Identifier 'blog_id' is not in camel case camelcase + 230:6 error Identifier 'user_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/purchases/test/selectors.js + 25:14 error Identifier 'product_name' is not in camel case camelcase + 25:51 error Identifier 'blog_id' is not in camel case camelcase + 26:14 error Identifier 'product_name' is not in camel case camelcase + 26:44 error Identifier 'blog_id' is not in camel case camelcase + 45:14 error Identifier 'product_name' is not in camel case camelcase + 45:45 error Identifier 'blog_id' is not in camel case camelcase + 65:16 error Identifier 'product_name' is not in camel case camelcase + 65:53 error Identifier 'blog_id' is not in camel case camelcase + 66:16 error Identifier 'product_name' is not in camel case camelcase + 66:46 error Identifier 'blog_id' is not in camel case camelcase + 165:8 error Identifier 'blog_id' is not in camel case camelcase + 169:8 error Identifier 'blog_id' is not in camel case camelcase + 173:8 error Identifier 'blog_id' is not in camel case camelcase + 200:8 error Identifier 'blog_id' is not in camel case camelcase + 201:8 error Identifier 'is_domain_registration' is not in camel case camelcase + 202:8 error Identifier 'product_slug' is not in camel case camelcase + 206:8 error Identifier 'blog_id' is not in camel case camelcase + 207:8 error Identifier 'product_slug' is not in camel case camelcase + 208:8 error Identifier 'included_domain' is not in camel case camelcase + 212:8 error Identifier 'blog_id' is not in camel case camelcase + 214:8 error Identifier 'product_slug' is not in camel case camelcase + 238:13 error Identifier 'product_name' is not in camel case camelcase + 238:50 error Identifier 'blog_id' is not in camel case camelcase + 238:65 error Identifier 'user_id' is not in camel case camelcase + 239:13 error Identifier 'product_name' is not in camel case camelcase + 239:43 error Identifier 'blog_id' is not in camel case camelcase + 239:58 error Identifier 'user_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/push-notifications/actions.js + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/push-notifications/test/actions.js + 70:13 error Strings must use singlequote quotes + +/Users/seear/repos/wp-calypso/client/state/push-notifications/test/reducer.js + 24:4 error Identifier 'long_desc' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/push-notifications/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/reader/conversations/reducer.js + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/conversations/test/actions.js + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/feed-searches/test/query-key.js + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/feed-searches/test/reducer.js + 18:3 error Identifier 'feed_URL' is not in camel case camelcase + 19:3 error Identifier 'subscribe_URL' is not in camel case camelcase + 20:3 error Identifier 'feed_ID' is not in camel case camelcase + 26:3 error Identifier 'feed_URL' is not in camel case camelcase + 27:3 error Identifier 'subscribe_URL' is not in camel case camelcase + 28:3 error Identifier 'feed_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/feeds/actions.js + 23:5 error Identifier 'feed_ID' is not in camel case camelcase + 41:8 error Identifier 'feed_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/feeds/reducer.js + 52:5 error Identifier 'feed_ID' is not in camel case camelcase + 53:5 error Identifier 'is_error' is not in camel case camelcase + 62:3 error Identifier 'feed_ID' is not in camel case camelcase + 63:3 error Identifier 'blog_ID' is not in camel case camelcase + 66:3 error Identifier 'feed_URL' is not in camel case camelcase + 67:3 error Identifier 'is_following' is not in camel case camelcase + 68:3 error Identifier 'subscribers_count' is not in camel case camelcase + 70:3 error Identifier 'last_update' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/feeds/schema.js + 10:5 error Identifier 'feed_ID' is not in camel case camelcase + 11:5 error Identifier 'blog_ID' is not in camel case camelcase + 14:5 error Identifier 'feed_URL' is not in camel case camelcase + 15:5 error Identifier 'is_following' is not in camel case camelcase + 16:5 error Identifier 'subscribers_count' is not in camel case camelcase + 18:5 error Identifier 'last_update' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/feeds/selectors.js + 48:43 error Identifier 'feed_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/feeds/test/actions.js + 28:6 error Identifier 'feed_ID' is not in camel case camelcase + 38:6 error Identifier 'feed_ID' is not in camel case camelcase + 49:8 error Identifier 'feed_ID' is not in camel case camelcase + 77:6 error Identifier 'feed_ID' is not in camel case camelcase + 92:8 error Identifier 'feed_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/feeds/test/reducer.js + 35:8 error Identifier 'feed_ID' is not in camel case camelcase + 36:8 error Identifier 'blog_ID' is not in camel case camelcase + 37:8 error Identifier 'feed_URL' is not in camel case camelcase + 38:8 error Identifier 'is_following' is not in camel case camelcase + 43:5 error Identifier 'feed_ID' is not in camel case camelcase + 44:5 error Identifier 'blog_ID' is not in camel case camelcase + 45:5 error Identifier 'feed_URL' is not in camel case camelcase + 47:5 error Identifier 'is_following' is not in camel case camelcase + 49:5 error Identifier 'subscribers_count' is not in camel case camelcase + 51:5 error Identifier 'last_update' is not in camel case camelcase + 63:8 error Identifier 'feed_ID' is not in camel case camelcase + 64:8 error Identifier 'blog_ID' is not in camel case camelcase + 71:5 error Identifier 'feed_ID' is not in camel case camelcase + 72:5 error Identifier 'blog_ID' is not in camel case camelcase + 76:5 error Identifier 'feed_URL' is not in camel case camelcase + 77:5 error Identifier 'is_following' is not in camel case camelcase + 78:5 error Identifier 'subscribers_count' is not in camel case camelcase + 79:5 error Identifier 'last_update' is not in camel case camelcase + 91:8 error Identifier 'feed_ID' is not in camel case camelcase + 92:8 error Identifier 'blog_ID' is not in camel case camelcase + 100:5 error Identifier 'feed_ID' is not in camel case camelcase + 101:5 error Identifier 'blog_ID' is not in camel case camelcase + 105:5 error Identifier 'feed_URL' is not in camel case camelcase + 106:5 error Identifier 'is_following' is not in camel case camelcase + 107:5 error Identifier 'subscribers_count' is not in camel case camelcase + 108:5 error Identifier 'last_update' is not in camel case camelcase + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + 120:11 error Identifier 'feed_ID' is not in camel case camelcase + 122:6 error Identifier 'feed_ID' is not in camel case camelcase + 123:6 error Identifier 'is_error' is not in camel case camelcase + 127:11 error Identifier 'feed_ID' is not in camel case camelcase + 135:1 error Line 135 exceeds the maximum line length of 100 max-len + 143:6 error Identifier 'feed_ID' is not in camel case camelcase + 144:6 error Identifier 'blog_ID' is not in camel case camelcase + 147:6 error Identifier 'feed_URL' is not in camel case camelcase + 148:6 error Identifier 'subscribers_count' is not in camel case camelcase + 149:6 error Identifier 'is_following' is not in camel case camelcase + 150:6 error Identifier 'last_update' is not in camel case camelcase + 164:18 error Identifier 'feed_ID' is not in camel case camelcase + 167:30 error Identifier 'feed_ID' is not in camel case camelcase + 167:44 error Identifier 'is_error' is not in camel case camelcase + 171:1 error Line 171 exceeds the maximum line length of 100 max-len + 171:47 error Identifier 'feed_ID' is not in camel case camelcase + 171:61 error Identifier 'blog_ID' is not in camel case camelcase + 176:7 error Identifier 'feed_ID' is not in camel case camelcase + 177:7 error Identifier 'blog_ID' is not in camel case camelcase + 179:7 error Identifier 'subscribers_count' is not in camel case camelcase + 185:6 error Identifier 'feed_ID' is not in camel case camelcase + 186:6 error Identifier 'blog_ID' is not in camel case camelcase + 188:6 error Identifier 'subscribers_count' is not in camel case camelcase + 189:6 error Identifier 'feed_URL' is not in camel case camelcase + 191:6 error Identifier 'is_following' is not in camel case camelcase + 193:6 error Identifier 'last_update' is not in camel case camelcase + 200:1 error Line 200 exceeds the maximum line length of 100 max-len + 200:47 error Identifier 'feed_ID' is not in camel case camelcase + 200:61 error Identifier 'blog_ID' is not in camel case camelcase + 205:17 error Identifier 'feed_ID' is not in camel case camelcase + 211:1 error Line 211 exceeds the maximum line length of 100 max-len + 211:47 error Identifier 'feed_ID' is not in camel case camelcase + 211:61 error Identifier 'blog_ID' is not in camel case camelcase + 216:9 error Identifier 'feed_ID' is not in camel case camelcase + 216:23 error Identifier 'blog_ID' is not in camel case camelcase + 216:60 error Identifier 'is_following' is not in camel case camelcase + 217:9 error Identifier 'feed_ID' is not in camel case camelcase + 217:21 error Identifier 'blog_ID' is not in camel case camelcase + 217:60 error Identifier 'is_following' is not in camel case camelcase + 218:9 error Identifier 'feed_ID' is not in camel case camelcase + 218:21 error Identifier 'blog_ID' is not in camel case camelcase + 218:51 error Identifier 'is_following' is not in camel case camelcase + 223:6 error Identifier 'feed_ID' is not in camel case camelcase + 224:6 error Identifier 'blog_ID' is not in camel case camelcase + 227:6 error Identifier 'feed_URL' is not in camel case camelcase + 228:6 error Identifier 'is_following' is not in camel case camelcase + 229:6 error Identifier 'subscribers_count' is not in camel case camelcase + 231:6 error Identifier 'last_update' is not in camel case camelcase + 235:6 error Identifier 'feed_ID' is not in camel case camelcase + 236:6 error Identifier 'blog_ID' is not in camel case camelcase + 239:6 error Identifier 'feed_URL' is not in camel case camelcase + 240:6 error Identifier 'is_following' is not in camel case camelcase + 241:6 error Identifier 'subscribers_count' is not in camel case camelcase + 243:6 error Identifier 'last_update' is not in camel case camelcase + 247:6 error Identifier 'feed_ID' is not in camel case camelcase + 248:6 error Identifier 'blog_ID' is not in camel case camelcase + 251:6 error Identifier 'feed_URL' is not in camel case camelcase + 252:6 error Identifier 'is_following' is not in camel case camelcase + 253:6 error Identifier 'subscribers_count' is not in camel case camelcase + 255:6 error Identifier 'last_update' is not in camel case camelcase + 269:18 error Identifier 'feed_ID' is not in camel case camelcase + 279:17 error Identifier 'feed_ID' is not in camel case camelcase + 290:16 error Identifier 'feed_ID' is not in camel case camelcase + 301:18 error Identifier 'feed_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/feeds/test/schema.js + 22:5 error Identifier 'feed_ID' is not in camel case camelcase + 23:5 error Identifier 'blog_ID' is not in camel case camelcase + 32:5 error Identifier 'feed_ID' is not in camel case camelcase + 33:5 error Identifier 'blog_ID' is not in camel case camelcase + 36:5 error Identifier 'feed_URL' is not in camel case camelcase + 37:5 error Identifier 'is_following' is not in camel case camelcase + 38:5 error Identifier 'subscribers_count' is not in camel case camelcase + 48:5 error Identifier 'feed_ID' is not in camel case camelcase + 49:5 error Identifier 'blog_ID' is not in camel case camelcase + 52:5 error Identifier 'feed_URL' is not in camel case camelcase + 53:5 error Identifier 'is_following' is not in camel case camelcase + 54:5 error Identifier 'subscribers_count' is not in camel case camelcase + 65:6 error Identifier 'feed_ID' is not in camel case camelcase + 66:6 error Identifier 'blog_ID' is not in camel case camelcase + 69:6 error Identifier 'feed_URL' is not in camel case camelcase + 70:6 error Identifier 'is_following' is not in camel case camelcase + 71:6 error Identifier 'subscribers_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/follows/actions.js + 69:1 error Expected JSDoc for 'error' but found 'response' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/reader/follows/reducer.js + 31:32 error Identifier 'blog_ID' is not in camel case camelcase + 42:13 error Identifier 'send_posts' is not in camel case camelcase + 46:13 error Identifier 'send_comments' is not in camel case camelcase + 51:12 error Identifier 'post_delivery_frequency' is not in camel case camelcase + 67:4 error Identifier 'delivery_methods' is not in camel case camelcase + 81:47 error Identifier 'is_following' is not in camel case camelcase + 88:47 error Identifier 'is_following' is not in camel case camelcase + 100:24 error Identifier 'is_following' is not in camel case camelcase + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 113:15 error Identifier 'alias_feed_URLs' is not in camel case camelcase + 126:8 error Identifier 'feed_URL' is not in camel case camelcase + 141:45 error Identifier 'is_following' is not in camel case camelcase + 152:7 error Identifier 'is_following' is not in camel case camelcase + 180:1 error Line 180 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/follows/schema.js + 11:5 error Identifier 'feed_URL' is not in camel case camelcase + 12:5 error Identifier 'is_following' is not in camel case camelcase + 14:5 error Identifier 'blog_ID' is not in camel case camelcase + 15:5 error Identifier 'feed_ID' is not in camel case camelcase + 16:5 error Identifier 'date_subscribed' is not in camel case camelcase + 17:5 error Identifier 'delivery_methods' is not in camel case camelcase + 18:5 error Identifier 'is_owner' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/follows/test/reducer.js + 55:33 error Identifier 'is_following' is not in camel case camelcase + 56:34 error Identifier 'is_following' is not in camel case camelcase + 62:45 error Identifier 'is_following' is not in camel case camelcase + 67:33 error Identifier 'blog_ID' is not in camel case camelcase + 67:47 error Identifier 'is_following' is not in camel case camelcase + 68:34 error Identifier 'blog_ID' is not in camel case camelcase + 68:48 error Identifier 'is_following' is not in camel case camelcase + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 74:58 error Identifier 'blog_ID' is not in camel case camelcase + 74:72 error Identifier 'is_following' is not in camel case camelcase + 79:33 error Identifier 'is_following' is not in camel case camelcase + 79:53 error Identifier 'blog_ID' is not in camel case camelcase + 80:34 error Identifier 'is_following' is not in camel case camelcase + 80:54 error Identifier 'blog_ID' is not in camel case camelcase + 83:46 error Identifier 'blog_ID' is not in camel case camelcase + 84:60 error Identifier 'blog_ID' is not in camel case camelcase + 93:5 error Identifier 'is_following' is not in camel case camelcase + 94:5 error Identifier 'blog_ID' is not in camel case camelcase + 100:5 error Identifier 'is_following' is not in camel case camelcase + 101:5 error Identifier 'blog_ID' is not in camel case camelcase + 109:6 error Identifier 'feed_URL' is not in camel case camelcase + 111:6 error Identifier 'is_following' is not in camel case camelcase + 112:6 error Identifier 'blog_ID' is not in camel case camelcase + 115:6 error Identifier 'feed_URL' is not in camel case camelcase + 117:6 error Identifier 'is_following' is not in camel case camelcase + 118:6 error Identifier 'blog_ID' is not in camel case camelcase + 123:6 error Identifier 'feed_URL' is not in camel case camelcase + 125:6 error Identifier 'is_following' is not in camel case camelcase + 126:6 error Identifier 'blog_ID' is not in camel case camelcase + 134:6 error Identifier 'feed_URL' is not in camel case camelcase + 136:6 error Identifier 'is_following' is not in camel case camelcase + 137:6 error Identifier 'blog_ID' is not in camel case camelcase + 148:6 error Identifier 'is_following' is not in camel case camelcase + 149:6 error Identifier 'blog_ID' is not in camel case camelcase + 159:6 error Identifier 'is_following' is not in camel case camelcase + 160:6 error Identifier 'blog_ID' is not in camel case camelcase + 162:6 error Identifier 'delivery_methods' is not in camel case camelcase + 164:8 error Identifier 'send_posts' is not in camel case camelcase + 172:6 error Identifier 'is_following' is not in camel case camelcase + 173:6 error Identifier 'blog_ID' is not in camel case camelcase + 175:6 error Identifier 'delivery_methods' is not in camel case camelcase + 177:8 error Identifier 'send_posts' is not in camel case camelcase + 187:6 error Identifier 'is_following' is not in camel case camelcase + 188:6 error Identifier 'blog_ID' is not in camel case camelcase + 190:6 error Identifier 'delivery_methods' is not in camel case camelcase + 192:8 error Identifier 'send_posts' is not in camel case camelcase + 204:6 error Identifier 'is_following' is not in camel case camelcase + 205:6 error Identifier 'blog_ID' is not in camel case camelcase + 207:6 error Identifier 'delivery_methods' is not in camel case camelcase + 209:8 error Identifier 'send_posts' is not in camel case camelcase + 221:6 error Identifier 'is_following' is not in camel case camelcase + 222:6 error Identifier 'blog_ID' is not in camel case camelcase + 224:6 error Identifier 'delivery_methods' is not in camel case camelcase + 226:8 error Identifier 'send_posts' is not in camel case camelcase + 236:7 error Identifier 'is_following' is not in camel case camelcase + 237:7 error Identifier 'blog_ID' is not in camel case camelcase + 239:7 error Identifier 'delivery_methods' is not in camel case camelcase + 241:9 error Identifier 'send_posts' is not in camel case camelcase + 242:9 error Identifier 'post_delivery_frequency' is not in camel case camelcase + 254:7 error Identifier 'is_following' is not in camel case camelcase + 255:7 error Identifier 'blog_ID' is not in camel case camelcase + 257:7 error Identifier 'delivery_methods' is not in camel case camelcase + 259:9 error Identifier 'send_posts' is not in camel case camelcase + 260:9 error Identifier 'post_delivery_frequency' is not in camel case camelcase + 273:6 error Identifier 'is_following' is not in camel case camelcase + 274:6 error Identifier 'blog_ID' is not in camel case camelcase + 276:6 error Identifier 'delivery_methods' is not in camel case camelcase + 278:8 error Identifier 'send_posts' is not in camel case camelcase + 293:6 error Identifier 'is_following' is not in camel case camelcase + 294:6 error Identifier 'blog_ID' is not in camel case camelcase + 296:6 error Identifier 'delivery_methods' is not in camel case camelcase + 298:8 error Identifier 'send_posts' is not in camel case camelcase + 299:8 error Identifier 'post_delivery_frequency' is not in camel case camelcase + 307:6 error Identifier 'is_following' is not in camel case camelcase + 308:6 error Identifier 'blog_ID' is not in camel case camelcase + 310:6 error Identifier 'delivery_methods' is not in camel case camelcase + 312:8 error Identifier 'send_posts' is not in camel case camelcase + 313:8 error Identifier 'post_delivery_frequency' is not in camel case camelcase + 323:6 error Identifier 'is_following' is not in camel case camelcase + 324:6 error Identifier 'blog_ID' is not in camel case camelcase + 326:6 error Identifier 'delivery_methods' is not in camel case camelcase + 328:8 error Identifier 'send_posts' is not in camel case camelcase + 329:8 error Identifier 'post_delivery_frequency' is not in camel case camelcase + 341:6 error Identifier 'is_following' is not in camel case camelcase + 342:6 error Identifier 'blog_ID' is not in camel case camelcase + 344:6 error Identifier 'delivery_methods' is not in camel case camelcase + 346:8 error Identifier 'send_posts' is not in camel case camelcase + 347:8 error Identifier 'post_delivery_frequency' is not in camel case camelcase + 359:6 error Identifier 'is_following' is not in camel case camelcase + 360:6 error Identifier 'blog_ID' is not in camel case camelcase + 362:6 error Identifier 'delivery_methods' is not in camel case camelcase + 364:8 error Identifier 'send_comments' is not in camel case camelcase + 372:6 error Identifier 'is_following' is not in camel case camelcase + 373:6 error Identifier 'blog_ID' is not in camel case camelcase + 375:6 error Identifier 'delivery_methods' is not in camel case camelcase + 377:8 error Identifier 'send_comments' is not in camel case camelcase + 387:6 error Identifier 'is_following' is not in camel case camelcase + 388:6 error Identifier 'blog_ID' is not in camel case camelcase + 390:6 error Identifier 'delivery_methods' is not in camel case camelcase + 392:8 error Identifier 'send_comments' is not in camel case camelcase + 404:6 error Identifier 'is_following' is not in camel case camelcase + 405:6 error Identifier 'blog_ID' is not in camel case camelcase + 407:6 error Identifier 'delivery_methods' is not in camel case camelcase + 409:8 error Identifier 'send_comments' is not in camel case camelcase + 421:6 error Identifier 'is_following' is not in camel case camelcase + 422:6 error Identifier 'blog_ID' is not in camel case camelcase + 424:6 error Identifier 'delivery_methods' is not in camel case camelcase + 426:8 error Identifier 'send_comments' is not in camel case camelcase + 434:6 error Identifier 'is_following' is not in camel case camelcase + 435:6 error Identifier 'blog_ID' is not in camel case camelcase + 437:6 error Identifier 'delivery_methods' is not in camel case camelcase + 439:8 error Identifier 'send_comments' is not in camel case camelcase + 449:6 error Identifier 'is_following' is not in camel case camelcase + 450:6 error Identifier 'blog_ID' is not in camel case camelcase + 452:6 error Identifier 'delivery_methods' is not in camel case camelcase + 454:8 error Identifier 'send_comments' is not in camel case camelcase + 466:6 error Identifier 'is_following' is not in camel case camelcase + 467:6 error Identifier 'blog_ID' is not in camel case camelcase + 469:6 error Identifier 'delivery_methods' is not in camel case camelcase + 471:8 error Identifier 'send_comments' is not in camel case camelcase + 482:40 error Identifier 'is_following' is not in camel case camelcase + 483:34 error Identifier 'is_following' is not in camel case camelcase + 490:5 error Identifier 'is_following' is not in camel case camelcase + 497:1 error Line 497 exceeds the maximum line length of 100 max-len + 500:6 error Identifier 'is_following' is not in camel case camelcase + 501:6 error Identifier 'blog_ID' is not in camel case camelcase + 508:6 error Identifier 'is_following' is not in camel case camelcase + 509:6 error Identifier 'feed_URL' is not in camel case camelcase + 510:6 error Identifier 'blog_ID' is not in camel case camelcase + 519:6 error Identifier 'feed_URL' is not in camel case camelcase + 520:6 error Identifier 'is_following' is not in camel case camelcase + 528:6 error Identifier 'is_following' is not in camel case camelcase + 529:6 error Identifier 'feed_URL' is not in camel case camelcase + 535:5 error Identifier 'blog_ID' is not in camel case camelcase + 536:5 error Identifier 'feed_ID' is not in camel case camelcase + 537:5 error Identifier 'feed_URL' is not in camel case camelcase + 538:5 error Identifier 'delivery_methods' is not in camel case camelcase + 540:7 error Identifier 'send_posts' is not in camel case camelcase + 549:6 error Identifier 'is_following' is not in camel case camelcase + 557:6 error Identifier 'is_following' is not in camel case camelcase + 558:6 error Identifier 'feed_URL' is not in camel case camelcase + 564:5 error Identifier 'blog_ID' is not in camel case camelcase + 565:5 error Identifier 'feed_ID' is not in camel case camelcase + 566:5 error Identifier 'feed_URL' is not in camel case camelcase + 567:5 error Identifier 'delivery_methods' is not in camel case camelcase + 569:7 error Identifier 'send_posts' is not in camel case camelcase + 578:6 error Identifier 'is_following' is not in camel case camelcase + 579:6 error Identifier 'alias_feed_URLs' is not in camel case camelcase + 589:6 error Identifier 'is_following' is not in camel case camelcase + 590:6 error Identifier 'feed_URL' is not in camel case camelcase + 591:6 error Identifier 'blog_ID' is not in camel case camelcase + 598:6 error Identifier 'is_following' is not in camel case camelcase + 599:6 error Identifier 'feed_URL' is not in camel case camelcase + 600:6 error Identifier 'blog_ID' is not in camel case camelcase + 608:6 error Identifier 'is_following' is not in camel case camelcase + 609:6 error Identifier 'feed_URL' is not in camel case camelcase + 610:6 error Identifier 'blog_ID' is not in camel case camelcase + 629:6 error Identifier 'feed_URL' is not in camel case camelcase + 631:6 error Identifier 'is_following' is not in camel case camelcase + 634:6 error Identifier 'feed_URL' is not in camel case camelcase + 636:6 error Identifier 'is_following' is not in camel case camelcase + 642:6 error Identifier 'feed_URL' is not in camel case camelcase + 644:6 error Identifier 'is_following' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/lists/schema.js + 15:5 error Identifier 'is_owner' is not in camel case camelcase + 16:5 error Identifier 'is_public' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/lists/test/actions.js + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/lists/test/reducer.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 186:1 error Line 186 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/posts/actions.js + 61:8 error Identifier 'feed_ID' is not in camel case camelcase + 63:8 error Identifier 'site_ID' is not in camel case camelcase + 64:8 error Identifier 'is_external' is not in camel case camelcase + 65:8 error Identifier 'is_error' is not in camel case camelcase + 66:8 error Identifier 'global_ID' is not in camel case camelcase + 129:1 error Line 129 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/posts/normalization-rules.js + 99:1 error Line 99 exceeds the maximum line length of 100 max-len + 113:7 error Identifier 'display_type' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/posts/test/actions.js + 54:6 error Identifier 'feed_ID' is not in camel case camelcase + 55:6 error Identifier 'site_ID' is not in camel case camelcase + 57:6 error Identifier 'feed_item_ID' is not in camel case camelcase + 58:6 error Identifier 'is_external' is not in camel case camelcase + 66:6 error Identifier 'site_ID' is not in camel case camelcase + 68:6 error Identifier 'is_external' is not in camel case camelcase + 76:6 error Identifier 'feed_ID' is not in camel case camelcase + 77:6 error Identifier 'site_ID' is not in camel case camelcase + 79:6 error Identifier 'feed_item_ID' is not in camel case camelcase + 80:6 error Identifier 'is_external' is not in camel case camelcase + 101:6 error Identifier 'site_ID' is not in camel case camelcase + 102:6 error Identifier 'global_ID' is not in camel case camelcase + 114:6 error Identifier 'site_ID' is not in camel case camelcase + 115:6 error Identifier 'global_ID' is not in camel case camelcase + 117:6 error Identifier '_should_reload' is not in camel case camelcase + 170:8 error Identifier 'site_ID' is not in camel case camelcase + 171:8 error Identifier 'is_external' is not in camel case camelcase + 172:8 error Identifier 'is_error' is not in camel case camelcase + 174:8 error Identifier 'feed_ID' is not in camel case camelcase + 175:8 error Identifier 'global_ID' is not in camel case camelcase + 197:8 error Identifier 'site_ID' is not in camel case camelcase + 198:8 error Identifier 'is_external' is not in camel case camelcase + 199:8 error Identifier 'is_error' is not in camel case camelcase + 201:8 error Identifier 'feed_ID' is not in camel case camelcase + 202:8 error Identifier 'global_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/posts/test/normalization-rules.js + 32:6 error Identifier 'canonical_media' is not in camel case camelcase + 36:6 error Identifier 'better_excerpt_no_html' is not in camel case camelcase + 45:6 error Identifier 'canonical_media' is not in camel case camelcase + 49:6 error Identifier 'better_excerpt_no_html' is not in camel case camelcase + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 58:6 error Identifier 'canonical_media' is not in camel case camelcase + 62:6 error Identifier 'content_images' is not in camel case camelcase + 76:6 error Identifier 'better_excerpt_no_html' is not in camel case camelcase + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + 88:5 error Identifier 'post_thumbnail' is not in camel case camelcase + 103:1 error Line 103 exceeds the maximum line length of 100 max-len + 105:5 error Identifier 'post_thumbnail' is not in camel case camelcase + 126:54 error Identifier 'site_ID' is not in camel case camelcase + 131:51 error Identifier 'site_ID' is not in camel case camelcase + 131:63 error Identifier 'discover_metadata' is not in camel case camelcase + 136:51 error Identifier 'site_ID' is not in camel case camelcase + 144:6 error Identifier 'discover_metadata' is not in camel case camelcase + 145:7 error Identifier 'discover_fp_post_formats' is not in camel case camelcase + 164:1 error Line 164 exceeds the maximum line length of 100 max-len + 165:54 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/posts/test/selectors.js + 38:11 error Identifier 'global_ID' is not in camel case camelcase + 48:5 error Identifier 'global_ID' is not in camel case camelcase + 62:11 error Identifier 'global_ID' is not in camel case camelcase + 63:11 error Identifier 'is_external' is not in camel case camelcase + 66:11 error Identifier 'global_ID' is not in camel case camelcase + 68:11 error Identifier 'site_ID' is not in camel case camelcase + 86:9 error Identifier 'global_ID' is not in camel case camelcase + 87:9 error Identifier 'is_external' is not in camel case camelcase + 90:9 error Identifier 'global_ID' is not in camel case camelcase + 92:9 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/recommended-sites/test/reducer.js + 17:3 error Identifier 'blog_url' is not in camel case camelcase + 21:3 error Identifier 'blog_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/related-posts/actions.js + 33:4 error Identifier 'site_id' is not in camel case camelcase + 34:4 error Identifier 'post_id' is not in camel case camelcase + 39:10 error Identifier 'size_local' is not in camel case camelcase + 40:10 error Identifier 'size_global' is not in camel case camelcase + 42:10 error Identifier 'size_local' is not in camel case camelcase + 43:10 error Identifier 'size_global' is not in camel case camelcase + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/related-posts/test/actions.js + 34:8 error Identifier 'global_ID' is not in camel case camelcase + 35:8 error Identifier 'site_ID' is not in camel case camelcase + 71:9 error Identifier 'global_ID' is not in camel case camelcase + 72:9 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/related-posts/test/reducer.js + 28:18 error Identifier 'global_ID' is not in camel case camelcase + 28:36 error Identifier 'global_ID' is not in camel case camelcase + 28:54 error Identifier 'global_ID' is not in camel case camelcase + 48:18 error Identifier 'global_ID' is not in camel case camelcase + 48:36 error Identifier 'global_ID' is not in camel case camelcase + 48:54 error Identifier 'global_ID' is not in camel case camelcase + 95:2 error Test title is used multiple times in the same test suite jest/no-identical-title + +/Users/seear/repos/wp-calypso/client/state/reader/site-blocks/actions.js + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/sites/reducer.js + 53:5 error Identifier 'is_error' is not in camel case camelcase + 77:14 error Identifier 'wpcom_url' is not in camel case camelcase + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/sites/schema.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 13:5 error Identifier 'feed_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/sites/selectors.js + 44:43 error Identifier 'feed_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/sites/test/reducer.js + 102:9 error Identifier 'is_redirect' is not in camel case camelcase + 103:9 error Identifier 'unmapped_url' is not in camel case camelcase + 116:6 error Identifier 'is_redirect' is not in camel case camelcase + 117:6 error Identifier 'unmapped_url' is not in camel case camelcase + 141:1 error Line 141 exceeds the maximum line length of 100 max-len + 149:6 error Identifier 'is_error' is not in camel case camelcase + 161:1 error Line 161 exceeds the maximum line length of 100 max-len + 186:39 error Identifier 'is_error' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/reader/thumbnails/actions.js + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/reader/thumbnails/reducer.js + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/receipts/actions.js + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/receipts/assembler.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'data' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/receipts/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/receipts/selectors.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/receipts/test/reducer.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/refer/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/are-all-sites-single-user.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/are-site-permalinks-editable.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/can-current-user.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/count-post-likes.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/edited-post-has-content.js + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-account-recovery-reset-options-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-account-recovery-reset-password-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-account-recovery-reset-request-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-account-recovery-reset-selected-method.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-account-recovery-reset-user-data.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-account-recovery-validation-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-account-recovery-validation-key.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-billing-transactions.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-blocked-sites.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-blog-stickers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-contact-details-cache.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-contact-details-extra-cache.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-credentials-auto-config-status.js + 7:1 error Line 7 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-image-editor-original-aspect-ratio.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-connection-status.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-jumpstart-status.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-module.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-modules-requiring-connection.js + 30:4 error Identifier 'module_slug' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-modules.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-setting.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-settings-save-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-settings-save-request-status.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-settings.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-sites.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jetpack-user-connection.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-jpo-connect.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-magic-login-current-view.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-magic-login-request-auth-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-magic-login-request-email-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-magic-login-requested-auth-successfully.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-magic-login-requested-email-successfully.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-media-url.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-menu-item-types.js + 101:1 error Line 101 exceeds the maximum line length of 100 max-len + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-menus-url.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-network-sites.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-original-user-setting.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-past-billing-transaction.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-plugin-upload-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-plugin-upload-progress.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-post-likes.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-post-share-published-actions.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-post-share-scheduled-actions.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-primary-domain-by-site-id.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-public-sites.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-publicize-connection.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-raw-offsets.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-reader-feeds-count-for-query.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-reader-feeds-for-query.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-reader-follow-for-blog.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-reader-follow-for-feed.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 16:73 error Identifier 'feed_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/get-reader-follows-count.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 18:47 error Identifier 'is_following' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/get-reader-follows-last-sync-time.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'state' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/selectors/get-restore-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-restore-progress.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-rewind-start-date.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-rewind-status-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-scheduled-publicize-share-action-time.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-selected-or-all-sites-jetpack-can-manage.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-selected-or-all-sites-with-plugins.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-selected-or-all-sites.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-selected-or-primary-site-id.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-sharing-buttons.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-simple-payments.js + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-comments-tree.js + 29:1 error Expected indentation of 4 tabs but found 5 indent + 30:1 error Expected indentation of 4 tabs but found 5 indent + 31:1 error Expected indentation of 3 tabs but found 4 indent + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-comments.js + 17:1 error Expected indentation of 3 tabs but found 4 indent + 18:1 error Expected indentation of 3 tabs but found 4 indent + 19:1 error Expected indentation of 2 tabs but found 3 indent + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-connection-status.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-gmt-offset.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-id.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-monitor-settings.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-options.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 25:27 error Identifier 'default_post_format' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-slugs-for-upcoming-transactions.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-stats-view-summary.js + 24:3 error Identifier 'stat_fields' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-timezone-name.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 18:8 error Identifier 'timezone_string' is not in camel case camelcase + 19:7 error Identifier 'timezone_string' is not in camel case camelcase + 20:10 error Identifier 'timezone_string' is not in camel case camelcase + 23:8 error Identifier 'gmt_offset' is not in camel case camelcase + 25:7 error Identifier 'gmt_offset' is not in camel case camelcase + 29:55 error Identifier 'gmt_offset' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/get-site-timezone-value.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-theme-filter-term-from-string.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-theme-filter-terms-table.js + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/get-timezones-by-continent.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-timezones-label.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-timezones-labels.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-uploaded-plugin-id.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-user-devices.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-user-setting.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-visible-sites.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/get-whois.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/has-jetpack-sites.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/has-site-pending-automated-transfer.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/has-unsaved-user-settings.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/index.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 172:1 error Line 172 exceeds the maximum line length of 100 max-len + 199:1 error Line 199 exceeds the maximum line length of 100 max-len + 200:1 error Line 200 exceeds the maximum line length of 100 max-len + 204:1 error Line 204 exceeds the maximum line length of 100 max-len + 222:1 error Line 222 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-account-recovery-reset-options-ready.js + 2:1 error Line 2 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-account-recovery-reset-password-succeeded.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-activating-jetpack-jumpstart.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-activating-jetpack-module.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-business-plan-user.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-connected-secondary-network-site.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 22:1 error Line 22 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-deactivating-jetpack-jumpstart.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-deactivating-jetpack-module.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-deleting-publicize-share-action.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-drop-zone-visible.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-editing-publicize-share-post-action.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-eligible-for-domain-to-paid-plan-upsell.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-eligible-for-free-to-paid-upsell.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-fetching-jetpack-modules.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-fetching-magic-login-auth.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-fetching-magic-login-email.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-fetching-publicize-share-actions-published.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-fetching-publicize-share-actions-scheduled.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-following.js + 20:48 error Identifier 'feed_ID' is not in camel case camelcase + 22:48 error Identifier 'blog_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/is-hidden-site.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-jetpack-module-active.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-jetpack-settings-save-failure.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-jetpack-user-master.js + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-main-site-of.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-notifications-open.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-pending-email-change.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-plugin-active.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-plugin-upload-complete.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-plugin-upload-in-progress.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-private-site.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-publicize-enabled.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-reader-card-expanded.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-regenerating-jetpack-post-by-email.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-account-recovery-reset-options.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-account-recovery-reset.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-billing-transactions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-contact-details-cache.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-jetpack-connection-status.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-jetpack-jumpstart-status.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-jetpack-settings.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-jetpack-user-connection.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-media-item.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-media.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-missing-sites.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-post-likes.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-reader-teams.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'state' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-reset-password.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-sharing-buttons.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-site-connection-status.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-site-monitor-settings.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-requesting-whois.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-rewind-activating.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-rewind-active.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-rtl.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-saving-sharing-buttons.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-scheduling-publicize-share-action-error.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-scheduling-publicize-share-action.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-sending-billing-receipt-email.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-sharing-buttons-save-successful.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-site-automated-transfer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-site-on-free-plan.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-site-supporting-image-editor.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-site-upgradeable.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-two-step-enabled.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-two-step-sms-enabled.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-updating-jetpack-settings.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-updating-site-monitor-settings.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-user-registration-days-within-range.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 10:1 error Line 10 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/is-user-setting-unsaved.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-valid-theme-filter-term.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-validating-account-recovery-key.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-vip-site.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/is-wordpress-update-successful.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/prepend-theme-filter-keys.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/should-sync-reader-follows.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/selectors/test/are-all-sites-single-user.js + 34:7 error Identifier 'single_user_site' is not in camel case camelcase + 38:7 error Identifier 'single_user_site' is not in camel case camelcase + 58:7 error Identifier 'single_user_site' is not in camel case camelcase + 62:7 error Identifier 'single_user_site' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/are-site-permalinks-editable.js + 35:9 error Identifier 'permalink_structure' is not in camel case camelcase + 55:9 error Identifier 'permalink_structure' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/can-current-user-manage-plugins.js + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 28:7 error Identifier 'edit_pages' is not in camel case camelcase + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 41:7 error Identifier 'edit_pages' is not in camel case camelcase + 44:7 error Identifier 'edit_posts' is not in camel case camelcase + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 58:7 error Identifier 'edit_pages' is not in camel case camelcase + 59:7 error Identifier 'manage_options' is not in camel case camelcase + 62:7 error Identifier 'edit_posts' is not in camel case camelcase + 63:7 error Identifier 'manage_options' is not in camel case camelcase + 66:7 error Identifier 'manage_options' is not in camel case camelcase + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 79:7 error Identifier 'manage_options' is not in camel case camelcase + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + 92:7 error Identifier 'edit_pages' is not in camel case camelcase + 93:7 error Identifier 'manage_options' is not in camel case camelcase + 96:7 error Identifier 'edit_posts' is not in camel case camelcase + 97:7 error Identifier 'manage_options' is not in camel case camelcase + 100:7 error Identifier 'manage_options' is not in camel case camelcase + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + 113:7 error Identifier 'edit_pages' is not in camel case camelcase + 114:7 error Identifier 'manage_options' is not in camel case camelcase + 117:7 error Identifier 'edit_posts' is not in camel case camelcase + 118:7 error Identifier 'manage_options' is not in camel case camelcase + 121:7 error Identifier 'manage_options' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/can-current-user.js + 34:8 error Identifier 'manage_options' is not in camel case camelcase + 52:8 error Identifier 'manage_options' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/edited-post-has-content.js + 40:10 error Identifier 'site_ID' is not in camel case camelcase + 41:10 error Identifier 'global_ID' is not in camel case camelcase + 66:10 error Identifier 'site_ID' is not in camel case camelcase + 67:10 error Identifier 'global_ID' is not in camel case camelcase + 93:10 error Identifier 'site_ID' is not in camel case camelcase + 94:10 error Identifier 'global_ID' is not in camel case camelcase + 120:10 error Identifier 'site_ID' is not in camel case camelcase + 121:10 error Identifier 'global_ID' is not in camel case camelcase + 147:10 error Identifier 'site_ID' is not in camel case camelcase + 148:10 error Identifier 'global_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/find-theme-filter-term.js + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/fixtures/jetpack-connection.js + 36:4 error Identifier 'edit_posts' is not in camel case camelcase + 49:4 error Identifier 'edit_posts' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/fixtures/jetpack-modules.js + 37:14 error Identifier 'api_module_list_response' is not in camel case camelcase + 65:3 error Identifier 'module_tags' is not in camel case camelcase + 76:3 error Identifier 'module_tags' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/fixtures/jetpack-settings.js + 4:3 error Identifier 'setting_1' is not in camel case camelcase + 5:3 error Identifier 'setting_2' is not in camel case camelcase + 6:3 error Identifier 'setting_10' is not in camel case camelcase + 7:3 error Identifier 'wp_mobile_excerpt' is not in camel case camelcase + 8:3 error Identifier 'wp_mobile_featured_images' is not in camel case camelcase + 11:3 error Identifier 'setting_1' is not in camel case camelcase + 12:3 error Identifier 'setting_2' is not in camel case camelcase + 13:3 error Identifier 'setting_3' is not in camel case camelcase + 14:4 error Identifier 'setting_4' is not in camel case camelcase + 23:3 error Identifier 'wp_mobile_excerpt' is not in camel case camelcase + 24:3 error Identifier 'wp_mobile_featured_images' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/fixtures/theme-filters.js + 13:1 error Line 13 exceeds the maximum line length of 100 max-len + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/fixtures/user-state.js + 10:5 error Identifier 'primary_blog' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-account-recovery-reset-request-error.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-current-user-payment-methods.js + 20:5 error Identifier 'country_short' is not in camel case camelcase + 38:5 error Identifier 'country_short' is not in camel case camelcase + 56:5 error Identifier 'country_short' is not in camel case camelcase + 74:5 error Identifier 'country_short' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-image-editor-is-greater-than-minimum-dimensions.js + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-jetpack-modules-requiring-connection.js + 35:9 error Identifier 'requires_connection' is not in camel case camelcase + 39:9 error Identifier 'requires_connection' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-jetpack-sites.js + 49:8 error Identifier 'unmapped_url' is not in camel case camelcase + 73:8 error Identifier 'unmapped_url' is not in camel case camelcase + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-jpo-connect.js + 20:19 error Identifier 'client_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-media-storage-limit.js + 19:14 error Identifier 'max_storage_bytes' is not in camel case camelcase + 35:14 error Identifier 'max_storage_bytes' is not in camel case camelcase + 44:9 error Identifier 'max_storage_bytes' is not in camel case camelcase + 51:9 error Identifier 'max_storage_bytes' is not in camel case camelcase + 51:9 error Identifier 'max_storage_bytes' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-media-storage-used.js + 19:14 error Identifier 'storage_used_bytes' is not in camel case camelcase + 35:14 error Identifier 'storage_used_bytes' is not in camel case camelcase + 44:9 error Identifier 'storage_used_bytes' is not in camel case camelcase + 51:9 error Identifier 'storage_used_bytes' is not in camel case camelcase + 51:9 error Identifier 'storage_used_bytes' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-menu-item-types.js + 88:8 error Identifier 'admin_url' is not in camel case camelcase + 110:8 error Identifier 'admin_url' is not in camel case camelcase + 121:8 error Identifier 'api_queryable' is not in camel case camelcase + 122:8 error Identifier 'map_meta_cap' is not in camel case camelcase + 124:9 error Identifier 'not_found' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-menus-url.js + 18:5 error Identifier 'edit_theme_options' is not in camel case camelcase + 21:5 error Identifier 'edit_theme_options' is not in camel case camelcase + 24:5 error Identifier 'edit_theme_options' is not in camel case camelcase + 27:5 error Identifier 'edit_theme_options' is not in camel case camelcase + 36:6 error Identifier 'admin_url' is not in camel case camelcase + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 74:7 error Identifier 'email_verified' is not in camel case camelcase + 89:7 error Identifier 'email_verified' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-network-sites.js + 32:7 error Identifier 'is_multisite' is not in camel case camelcase + 35:8 error Identifier 'unmapped_url' is not in camel case camelcase + 36:8 error Identifier 'main_network_site' is not in camel case camelcase + 72:7 error Identifier 'is_multisite' is not in camel case camelcase + 74:8 error Identifier 'unmapped_url' is not in camel case camelcase + 75:8 error Identifier 'main_network_site' is not in camel case camelcase + 91:7 error Identifier 'is_multisite' is not in camel case camelcase + 94:8 error Identifier 'unmapped_url' is not in camel case camelcase + 95:8 error Identifier 'main_network_site' is not in camel case camelcase + 100:7 error Identifier 'is_multisite' is not in camel case camelcase + 103:8 error Identifier 'unmapped_url' is not in camel case camelcase + 104:8 error Identifier 'main_network_site' is not in camel case camelcase + 109:7 error Identifier 'is_multisite' is not in camel case camelcase + 112:8 error Identifier 'unmapped_url' is not in camel case camelcase + 113:8 error Identifier 'main_network_site' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-post-revision-changes.js + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + 99:1 error Line 99 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-post-revision.js + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-post-revisions-authors-id.js + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-post-revisions.js + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-primary-site-id.js + 29:7 error Identifier 'primary_blog' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-public-sites.js + 33:7 error Identifier 'is_private' is not in camel case camelcase + 37:8 error Identifier 'unmapped_url' is not in camel case camelcase + 42:7 error Identifier 'is_private' is not in camel case camelcase + 46:8 error Identifier 'unmapped_url' is not in camel case camelcase + 59:5 error Identifier 'is_private' is not in camel case camelcase + 66:5 error Identifier 'is_customizable' is not in camel case camelcase + 67:5 error Identifier 'is_previewable' is not in camel case camelcase + 69:6 error Identifier 'default_post_format' is not in camel case camelcase + 70:6 error Identifier 'unmapped_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-reader-aliased-follow-feed-url.js + 27:7 error Identifier 'feed_URL' is not in camel case camelcase + 28:7 error Identifier 'alias_feed_URLs' is not in camel case camelcase + 30:19 error Identifier 'feed_URL' is not in camel case camelcase + 31:19 error Identifier 'feed_URL' is not in camel case camelcase + 32:19 error Identifier 'feed_URL' is not in camel case camelcase + 33:19 error Identifier 'feed_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-reader-conversation-follow-status.js + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-reader-follows.js + 23:3 error Identifier 'feed_ID' is not in camel case camelcase + 26:3 error Identifier 'feed_ID' is not in camel case camelcase + 39:7 error Identifier 'blog_ID' is not in camel case camelcase + 43:7 error Identifier 'feed_ID' is not in camel case camelcase + 47:7 error Identifier 'blog_ID' is not in camel case camelcase + 48:7 error Identifier 'feed_ID' is not in camel case camelcase + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 72:5 error Identifier 'blog_ID' is not in camel case camelcase + 78:5 error Identifier 'feed_ID' is not in camel case camelcase + 84:5 error Identifier 'blog_ID' is not in camel case camelcase + 86:5 error Identifier 'feed_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-selected-or-all-sites-jetpack-can-manage.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 51:7 error Identifier 'edit_pages' is not in camel case camelcase + 52:7 error Identifier 'manage_options' is not in camel case camelcase + 62:8 error Identifier 'jetpack_version' is not in camel case camelcase + 74:1 error Line 74 exceeds the maximum line length of 100 max-len + 81:7 error Identifier 'edit_pages' is not in camel case camelcase + 82:7 error Identifier 'manage_options' is not in camel case camelcase + 85:7 error Identifier 'edit_pages' is not in camel case camelcase + 86:7 error Identifier 'manage_options' is not in camel case camelcase + 96:8 error Identifier 'active_modules' is not in camel case camelcase + 97:8 error Identifier 'jetpack_version' is not in camel case camelcase + 107:8 error Identifier 'jetpack_version' is not in camel case camelcase + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 127:7 error Identifier 'edit_pages' is not in camel case camelcase + 128:7 error Identifier 'manage_options' is not in camel case camelcase + 131:7 error Identifier 'edit_pages' is not in camel case camelcase + 132:7 error Identifier 'manage_options' is not in camel case camelcase + 142:8 error Identifier 'active_modules' is not in camel case camelcase + 143:8 error Identifier 'jetpack_version' is not in camel case camelcase + 150:8 error Identifier 'active_modules' is not in camel case camelcase + 151:8 error Identifier 'jetpack_version' is not in camel case camelcase + 170:7 error Identifier 'manage_options' is not in camel case camelcase + 173:7 error Identifier 'manage_options' is not in camel case camelcase + 183:8 error Identifier 'jetpack_version' is not in camel case camelcase + 190:8 error Identifier 'jetpack_version' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-selected-or-all-sites-with-plugins.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 51:7 error Identifier 'manage_options' is not in camel case camelcase + 78:7 error Identifier 'manage_options' is not in camel case camelcase + 81:7 error Identifier 'manage_options' is not in camel case camelcase + 118:7 error Identifier 'manage_options' is not in camel case camelcase + 121:7 error Identifier 'manage_options' is not in camel case camelcase + 153:7 error Identifier 'manage_options' is not in camel case camelcase + 156:7 error Identifier 'manage_options' is not in camel case camelcase + 167:8 error Identifier 'manage_options' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-selected-or-primary-site-id.js + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 36:35 error Identifier 'primary_blog' is not in camel case camelcase + 45:35 error Identifier 'primary_blog' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-default-post-format.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 25:8 error Identifier 'default_post_format' is not in camel case camelcase + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 40:7 error Identifier 'default_post_format' is not in camel case camelcase + 57:7 error Identifier 'default_post_format' is not in camel case camelcase + 65:8 error Identifier 'default_post_format' is not in camel case camelcase + 84:8 error Identifier 'default_post_format' is not in camel case camelcase + 103:8 error Identifier 'default_post_format' is not in camel case camelcase + 132:1 error Line 132 exceeds the maximum line length of 100 max-len + 138:8 error Identifier 'some_option' is not in camel case camelcase + 160:8 error Identifier 'default_post_format' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-gmt-offset.js + 43:7 error Identifier 'gmt_offset' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-icon-id.js + 39:9 error Identifier 'media_id' is not in camel case camelcase + 47:8 error Identifier 'site_icon' is not in camel case camelcase + 72:8 error Identifier 'site_icon' is not in camel case camelcase + 92:8 error Identifier 'site_icon' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-icon-url.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 70:9 error Identifier 'media_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-monitor-settings.js + 16:3 error Identifier 'email_notifications' is not in camel case camelcase + 17:3 error Identifier 'monitor_active' is not in camel case camelcase + 18:3 error Identifier 'wp_note_notifications' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-options.js + 38:4 error Identifier 'default_post_format' is not in camel case camelcase + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 60:4 error Identifier 'default_post_format' is not in camel case camelcase + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + 75:8 error Identifier 'default_post_format' is not in camel case camelcase + 84:4 error Identifier 'default_post_format' is not in camel case camelcase + 99:8 error Identifier 'default_post_format' is not in camel case camelcase + 108:4 error Identifier 'default_post_format' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-setting.js + 17:16 error Identifier 'default_category' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-slugs-for-upcoming-transactions.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 29:32 error Identifier 'blog_id' is not in camel case camelcase + 29:68 error Identifier 'blog_id' is not in camel case camelcase + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 50:32 error Identifier 'blog_id' is not in camel case camelcase + 50:68 error Identifier 'blog_id' is not in camel case camelcase + 67:32 error Identifier 'blog_id' is not in camel case camelcase + 84:32 error Identifier 'blog_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-stats-query-date.js + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-timezone-name.js + 43:7 error Identifier 'timezone_string' is not in camel case camelcase + 44:7 error Identifier 'gmt_offset' is not in camel case camelcase + 59:7 error Identifier 'timezone_string' is not in camel case camelcase + 60:7 error Identifier 'gmt_offset' is not in camel case camelcase + 75:7 error Identifier 'timezone_string' is not in camel case camelcase + 76:7 error Identifier 'gmt_offset' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-site-timezone-value.js + 43:7 error Identifier 'timezone_string' is not in camel case camelcase + 58:7 error Identifier 'timezone_string' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-sites.js + 21:5 error Identifier 'primary_blog' is not in camel case camelcase + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 118:1 error Line 118 exceeds the maximum line length of 100 max-len + 138:1 error Line 138 exceeds the maximum line length of 100 max-len + 139:1 error Line 139 exceeds the maximum line length of 100 max-len + 140:1 error Line 140 exceeds the maximum line length of 100 max-len + 144:1 error Line 144 exceeds the maximum line length of 100 max-len + 145:1 error Line 145 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-theme-filter-term.js + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-theme-filter-to-term-table.js + 15:1 error Line 15 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-theme-showcase-description.js + 25:1 error Line 25 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-theme-showcase-title.js + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-timezones.js + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-user-devices.js + 21:9 error Identifier 'device_id' is not in camel case camelcase + 21:23 error Identifier 'device_name' is not in camel case camelcase + 22:9 error Identifier 'device_id' is not in camel case camelcase + 22:23 error Identifier 'device_name' is not in camel case camelcase + 27:6 error Identifier 'device_id' is not in camel case camelcase + 27:20 error Identifier 'device_name' is not in camel case camelcase + 28:6 error Identifier 'device_id' is not in camel case camelcase + 28:20 error Identifier 'device_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/get-visible-sites.js + 36:8 error Identifier 'unmapped_url' is not in camel case camelcase + 45:8 error Identifier 'unmapped_url' is not in camel case camelcase + 65:5 error Identifier 'is_customizable' is not in camel case camelcase + 66:5 error Identifier 'is_previewable' is not in camel case camelcase + 68:6 error Identifier 'default_post_format' is not in camel case camelcase + 69:6 error Identifier 'unmapped_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/has-broken-site-user-connection.js + 36:20 error Identifier 'site_ID' is not in camel case camelcase + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 37:20 error Identifier 'site_ID' is not in camel case camelcase + 37:38 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 55:20 error Identifier 'site_ID' is not in camel case camelcase + 58:9 error Identifier 'site_ID' is not in camel case camelcase + 59:9 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/has-jetpack-sites.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 70:1 error Line 70 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/has-site-pending-automated-transfer.js + 30:8 error Identifier 'is_automated_transfer' is not in camel case camelcase + 31:8 error Identifier 'has_pending_automated_transfer' is not in camel case camelcase + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 47:8 error Identifier 'has_pending_automated_transfer' is not in camel case camelcase + 66:9 error Identifier 'has_pending_automated_transfer' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/index.js + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-automated-transfer-active.js + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-automated-transfer-failed.js + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-business-plan-user.js + 24:7 error Identifier 'user_id' is not in camel case camelcase + 25:7 error Identifier 'product_slug' is not in camel case camelcase + 28:7 error Identifier 'user_id' is not in camel case camelcase + 29:7 error Identifier 'product_slug' is not in camel case camelcase + 47:7 error Identifier 'user_id' is not in camel case camelcase + 48:7 error Identifier 'product_slug' is not in camel case camelcase + 51:7 error Identifier 'user_id' is not in camel case camelcase + 52:7 error Identifier 'product_slug' is not in camel case camelcase + 79:7 error Identifier 'user_id' is not in camel case camelcase + 80:7 error Identifier 'product_slug' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-connected-secondary-network-site.js + 29:7 error Identifier 'is_multisite' is not in camel case camelcase + 32:8 error Identifier 'unmapped_url' is not in camel case camelcase + 33:8 error Identifier 'main_network_site' is not in camel case camelcase + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 49:7 error Identifier 'is_multisite' is not in camel case camelcase + 52:8 error Identifier 'unmapped_url' is not in camel case camelcase + 53:8 error Identifier 'main_network_site' is not in camel case camelcase + 62:1 error Line 62 exceeds the maximum line length of 100 max-len + 68:7 error Identifier 'is_multisite' is not in camel case camelcase + 71:8 error Identifier 'unmapped_url' is not in camel case camelcase + 72:8 error Identifier 'main_network_site' is not in camel case camelcase + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 87:7 error Identifier 'is_multisite' is not in camel case camelcase + 90:8 error Identifier 'unmapped_url' is not in camel case camelcase + 91:8 error Identifier 'main_network_site' is not in camel case camelcase + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 106:7 error Identifier 'is_multisite' is not in camel case camelcase + 109:8 error Identifier 'unmapped_url' is not in camel case camelcase + 110:8 error Identifier 'main_network_site' is not in camel case camelcase + 115:7 error Identifier 'is_multisite' is not in camel case camelcase + 118:8 error Identifier 'unmapped_url' is not in camel case camelcase + 119:8 error Identifier 'main_network_site' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-domain-only-site.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 38:9 error Identifier 'is_domain_only' is not in camel case camelcase + 59:9 error Identifier 'is_domain_only' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-eligible-for-free-to-paid-upsell.js + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-email-blacklisted.js + 18:5 error Identifier 'blacklist_keys' is not in camel case camelcase + 21:5 error Identifier 'blacklist_keys' is not in camel case camelcase + 24:5 error Identifier 'blacklist_keys' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-fetching-automated-transfer-status.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-following.js + 20:7 error Identifier 'feed_ID' is not in camel case camelcase + 21:7 error Identifier 'blog_ID' is not in camel case camelcase + 22:7 error Identifier 'feed_URL' is not in camel case camelcase + 23:7 error Identifier 'is_following' is not in camel case camelcase + 26:7 error Identifier 'feed_ID' is not in camel case camelcase + 27:7 error Identifier 'blog_ID' is not in camel case camelcase + 28:7 error Identifier 'feed_URL' is not in camel case camelcase + 29:7 error Identifier 'is_following' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-hidden-site.js + 20:8 error Identifier 'blog_public' is not in camel case camelcase + 37:8 error Identifier 'blog_public' is not in camel case camelcase + 54:8 error Identifier 'blog_public' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-jetpack-module-unavailable-in-development-mode.js + 39:9 error Identifier 'requires_connection' is not in camel case camelcase + 63:9 error Identifier 'requires_connection' is not in camel case camelcase + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-main-site-of.js + 29:7 error Identifier 'is_multisite' is not in camel case camelcase + 32:8 error Identifier 'unmapped_url' is not in camel case camelcase + 33:8 error Identifier 'main_network_site' is not in camel case camelcase + 48:7 error Identifier 'is_multisite' is not in camel case camelcase + 51:8 error Identifier 'unmapped_url' is not in camel case camelcase + 52:8 error Identifier 'main_network_site' is not in camel case camelcase + 67:7 error Identifier 'is_multisite' is not in camel case camelcase + 70:8 error Identifier 'unmapped_url' is not in camel case camelcase + 71:8 error Identifier 'main_network_site' is not in camel case camelcase + 76:7 error Identifier 'is_multisite' is not in camel case camelcase + 79:8 error Identifier 'unmapped_url' is not in camel case camelcase + 80:8 error Identifier 'main_network_site' is not in camel case camelcase + 95:7 error Identifier 'is_multisite' is not in camel case camelcase + 98:8 error Identifier 'unmapped_url' is not in camel case camelcase + 99:8 error Identifier 'main_network_site' is not in camel case camelcase + 104:7 error Identifier 'is_multisite' is not in camel case camelcase + 107:8 error Identifier 'unmapped_url' is not in camel case camelcase + 108:8 error Identifier 'main_network_site' is not in camel case camelcase + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 123:7 error Identifier 'is_multisite' is not in camel case camelcase + 126:8 error Identifier 'unmapped_url' is not in camel case camelcase + 127:8 error Identifier 'main_network_site' is not in camel case camelcase + 132:7 error Identifier 'is_multisite' is not in camel case camelcase + 135:8 error Identifier 'unmapped_url' is not in camel case camelcase + 136:8 error Identifier 'main_network_site' is not in camel case camelcase + 151:7 error Identifier 'is_multisite' is not in camel case camelcase + 154:8 error Identifier 'unmapped_url' is not in camel case camelcase + 155:8 error Identifier 'main_network_site' is not in camel case camelcase + 160:7 error Identifier 'is_multisite' is not in camel case camelcase + 163:8 error Identifier 'unmapped_url' is not in camel case camelcase + 164:8 error Identifier 'main_network_site' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-mapped-domain-site.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 38:9 error Identifier 'is_mapped_domain' is not in camel case camelcase + 59:9 error Identifier 'is_mapped_domain' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-private-site.js + 21:8 error Identifier 'is_private' is not in camel case camelcase + 42:8 error Identifier 'is_private' is not in camel case camelcase + 49:8 error Identifier 'blog_public' is not in camel case camelcase + 69:8 error Identifier 'blog_public' is not in camel case camelcase + 87:8 error Identifier 'is_private' is not in camel case camelcase + 94:8 error Identifier 'blog_public' is not in camel case camelcase + 112:8 error Identifier 'is_private' is not in camel case camelcase + 119:8 error Identifier 'blog_public' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-publicize-enabled.js + 25:9 error Identifier 'publicize_permanently_disabled' is not in camel case camelcase + 47:9 error Identifier 'active_modules' is not in camel case camelcase + 69:9 error Identifier 'active_modules' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-requesting-account-recovery-reset-options.js + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-requesting-site-connection-status.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-requesting-site-monitor-settings.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-site-supporting-image-editor.js + 38:8 error Identifier 'is_private' is not in camel case camelcase + 58:8 error Identifier 'is_private' is not in camel case camelcase + 78:8 error Identifier 'is_private' is not in camel case camelcase + 81:9 error Identifier 'active_modules' is not in camel case camelcase + 101:8 error Identifier 'is_private' is not in camel case camelcase + 104:9 error Identifier 'active_modules' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-site-upgradeable.js + 23:9 error Identifier 'unmapped_url' is not in camel case camelcase + 47:9 error Identifier 'unmapped_url' is not in camel case camelcase + 69:9 error Identifier 'unmapped_url' is not in camel case camelcase + 91:9 error Identifier 'unmapped_url' is not in camel case camelcase + 100:8 error Identifier 'manage_options' is not in camel case camelcase + 120:9 error Identifier 'unmapped_url' is not in camel case camelcase + 129:8 error Identifier 'manage_options' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-transient-media.js + 56:41 error Unquoted reserved word 'transient' used as key quote-props + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-updating-site-monitor-settings.js + 16:1 error Line 16 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-user-registration-days-within-range.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 54:1 error Line 54 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/selectors/test/is-vip-site.js + 15:53 error Identifier 'is_vip' is not in camel case camelcase + 20:53 error Identifier 'is_vip' is not in camel case camelcase + 25:53 error Identifier 'is_vip' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/utils/index.js + 27:11 error Identifier 'connection_id' is not in camel case camelcase + 27:43 error Identifier 'share_date' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/selectors/utils/revisions/index.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sharing/keyring/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sharing/keyring/schema.js + 11:5 error Identifier 'additional_external_users' is not in camel case camelcase + 13:5 error Identifier 'external_ID' is not in camel case camelcase + 14:5 error Identifier 'external_display' is not in camel case camelcase + 15:5 error Identifier 'external_name' is not in camel case camelcase + 16:5 error Identifier 'external_profile_picture' is not in camel case camelcase + 20:5 error Identifier 'refresh_URL' is not in camel case camelcase + 25:5 error Identifier 'user_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/keyring/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sharing/keyring/test/actions.js + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 87:1 error Line 87 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sharing/keyring/test/reducer.js + 124:7 error Identifier 'keyring_connection_ID' is not in camel case camelcase + 125:7 error Identifier 'site_ID' is not in camel case camelcase + 143:7 error Identifier 'keyring_connection_ID' is not in camel case camelcase + 144:7 error Identifier 'site_ID' is not in camel case camelcase + 157:18 error Identifier 'site_ID' is not in camel case camelcase + 158:18 error Identifier 'site_ID' is not in camel case camelcase + 164:7 error Identifier 'site_ID' is not in camel case camelcase + 170:17 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/keyring/test/selectors.js + 33:1 error Line 33 exceeds the maximum line length of 100 max-len + 33:59 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 53:55 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + 110:55 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + 211:1 error Line 211 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/publicize-actions/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 128:1 error Line 128 exceeds the maximum line length of 100 max-len + 134:73 error Identifier 'share_date' is not in camel case camelcase + 143:1 error Line 143 exceeds the maximum line length of 100 max-len + 147:22 error Identifier 'share_date' is not in camel case camelcase + 147:22 error Identifier 'share_date' is not in camel case camelcase + 176:67 error Identifier 'share_date' is not in camel case camelcase + 186:21 error Identifier 'connection_id' is not in camel case camelcase + 189:23 error Identifier 'share_date' is not in camel case camelcase + 189:23 error Identifier 'share_date' is not in camel case camelcase + 189:35 error Identifier 'connection_id' is not in camel case camelcase + 189:35 error Identifier 'connection_id' is not in camel case camelcase + 208:6 error Identifier 'share_date' is not in camel case camelcase + 208:6 error Identifier 'share_date' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/publicize-actions/reducer.js + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + 142:75 error Identifier 'share_date' is not in camel case camelcase + 143:1 error Line 143 exceeds the maximum line length of 100 max-len + 143:55 error Identifier 'share_date' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/publicize-actions/schema.js + 10:5 error Identifier 'connection_id' is not in camel case camelcase + 12:5 error Identifier 'share_date' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/publicize-actions/test/reducer.js + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 43:1 error Line 43 exceeds the maximum line length of 100 max-len + 77:5 error Identifier 'share_date' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/reducer.js + 101:1 error Line 101 exceeds the maximum line length of 100 max-len + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + 113:1 error Line 113 exceeds the maximum line length of 100 max-len + 122:24 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/schema.js + 10:5 error Identifier 'site_ID' is not in camel case camelcase + 11:5 error Identifier 'user_ID' is not in camel case camelcase + 12:5 error Identifier 'keyring_connection_ID' is not in camel case camelcase + 13:5 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 19:5 error Identifier 'external_ID' is not in camel case camelcase + 20:5 error Identifier 'external_name' is not in camel case camelcase + 21:5 error Identifier 'external_display' is not in camel case camelcase + 22:5 error Identifier 'external_profile_picture' is not in camel case camelcase + 23:5 error Identifier 'external_profile_URL' is not in camel case camelcase + 24:5 error Identifier 'external_follower_count' is not in camel case camelcase + 26:5 error Identifier 'refresh_URL' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/selectors.js + 24:56 error Identifier 'site_ID' is not in camel case camelcase + 38:11 error Identifier 'site_ID' is not in camel case camelcase + 38:28 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 39:10 error Identifier 'site_ID' is not in camel case camelcase + 39:44 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 99:50 error Identifier 'user_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/test/actions.js + 50:30 error Identifier 'site_ID' is not in camel case camelcase + 75:59 error Identifier 'site_ID' is not in camel case camelcase + 102:27 error Identifier 'site_ID' is not in camel case camelcase + 127:51 error Identifier 'site_ID' is not in camel case camelcase + 155:6 error Identifier 'external_user_ID' is not in camel case camelcase + 156:6 error Identifier 'keyring_connection_ID' is not in camel case camelcase + 161:6 error Identifier 'site_ID' is not in camel case camelcase + 164:6 error Identifier 'external_user_ID' is not in camel case camelcase + 165:6 error Identifier 'keyring_connection_ID' is not in camel case camelcase + 179:50 error Identifier 'site_ID' is not in camel case camelcase + 188:1 error Line 188 exceeds the maximum line length of 100 max-len + 205:6 error Identifier 'site_ID' is not in camel case camelcase + 217:35 error Identifier 'site_ID' is not in camel case camelcase + 223:50 error Identifier 'site_ID' is not in camel case camelcase + 228:35 error Identifier 'site_ID' is not in camel case camelcase + 234:1 error Line 234 exceeds the maximum line length of 100 max-len + 257:35 error Identifier 'site_ID' is not in camel case camelcase + 262:7 error Identifier 'site_ID' is not in camel case camelcase + 269:35 error Identifier 'site_ID' is not in camel case camelcase + 273:1 error Line 273 exceeds the maximum line length of 100 max-len + 282:46 error Identifier 'site_ID' is not in camel case camelcase + 288:6 error Identifier 'site_ID' is not in camel case camelcase + 309:43 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/test/reducer.js + 146:31 error Identifier 'site_ID' is not in camel case camelcase + 151:18 error Identifier 'site_ID' is not in camel case camelcase + 158:19 error Identifier 'site_ID' is not in camel case camelcase + 164:32 error Identifier 'site_ID' is not in camel case camelcase + 170:18 error Identifier 'site_ID' is not in camel case camelcase + 171:18 error Identifier 'site_ID' is not in camel case camelcase + 178:19 error Identifier 'site_ID' is not in camel case camelcase + 184:32 error Identifier 'site_ID' is not in camel case camelcase + 190:18 error Identifier 'site_ID' is not in camel case camelcase + 195:33 error Identifier 'site_ID' is not in camel case camelcase + 198:19 error Identifier 'site_ID' is not in camel case camelcase + 217:41 error Identifier 'site_ID' is not in camel case camelcase + 218:31 error Identifier 'site_ID' is not in camel case camelcase + 236:36 error Identifier 'site_ID' is not in camel case camelcase + 239:20 error Identifier 'site_ID' is not in camel case camelcase + 257:19 error Identifier 'site_ID' is not in camel case camelcase + 258:19 error Identifier 'site_ID' is not in camel case camelcase + 264:8 error Identifier 'site_ID' is not in camel case camelcase + 270:18 error Identifier 'site_ID' is not in camel case camelcase + 277:41 error Identifier 'site_ID' is not in camel case camelcase + 278:31 error Identifier 'site_ID' is not in camel case camelcase + 296:36 error Identifier 'site_ID' is not in camel case camelcase + 299:20 error Identifier 'site_ID' is not in camel case camelcase + 315:41 error Identifier 'site_ID' is not in camel case camelcase + 316:31 error Identifier 'site_ID' is not in camel case camelcase + 334:36 error Identifier 'site_ID' is not in camel case camelcase + 337:20 error Identifier 'site_ID' is not in camel case camelcase + 356:18 error Identifier 'site_ID' is not in camel case camelcase + 357:18 error Identifier 'site_ID' is not in camel case camelcase + 365:18 error Identifier 'site_ID' is not in camel case camelcase + 366:18 error Identifier 'site_ID' is not in camel case camelcase + 376:20 error Identifier 'site_ID' is not in camel case camelcase + 377:20 error Identifier 'site_ID' is not in camel case camelcase + 387:18 error Identifier 'site_ID' is not in camel case camelcase + 388:18 error Identifier 'site_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/publicize/test/selectors.js + 27:18 error Identifier 'site_ID' is not in camel case camelcase + 30:7 error Identifier 'site_ID' is not in camel case camelcase + 32:7 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 85:5 error Identifier 'site_ID' is not in camel case camelcase + 87:5 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 116:20 error Identifier 'site_ID' is not in camel case camelcase + 117:20 error Identifier 'site_ID' is not in camel case camelcase + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 125:44 error Identifier 'site_ID' is not in camel case camelcase + 125:73 error Identifier 'site_ID' is not in camel case camelcase + 146:1 error Line 146 exceeds the maximum line length of 100 max-len + 152:20 error Identifier 'site_ID' is not in camel case camelcase + 153:20 error Identifier 'site_ID' is not in camel case camelcase + 153:38 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 154:20 error Identifier 'site_ID' is not in camel case camelcase + 154:38 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 164:13 error Identifier 'site_ID' is not in camel case camelcase + 165:13 error Identifier 'site_ID' is not in camel case camelcase + 165:31 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 188:1 error Line 188 exceeds the maximum line length of 100 max-len + 197:20 error Identifier 'site_ID' is not in camel case camelcase + 200:9 error Identifier 'site_ID' is not in camel case camelcase + 201:9 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 206:9 error Identifier 'site_ID' is not in camel case camelcase + 207:9 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 220:13 error Identifier 'site_ID' is not in camel case camelcase + 221:13 error Identifier 'site_ID' is not in camel case camelcase + 221:31 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 232:6 error Identifier 'edit_others_posts' is not in camel case camelcase + 242:18 error Identifier 'site_ID' is not in camel case camelcase + 242:70 error Identifier 'user_ID' is not in camel case camelcase + 245:7 error Identifier 'site_ID' is not in camel case camelcase + 246:7 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 248:7 error Identifier 'user_ID' is not in camel case camelcase + 250:1 error Line 250 exceeds the maximum line length of 100 max-len + 250:18 error Identifier 'site_ID' is not in camel case camelcase + 250:36 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 259:7 error Identifier 'edit_others_posts' is not in camel case camelcase + 263:7 error Identifier 'unmapped_url' is not in camel case camelcase + 280:1 error Line 280 exceeds the maximum line length of 100 max-len + 284:13 error Identifier 'site_ID' is not in camel case camelcase + 284:65 error Identifier 'user_ID' is not in camel case camelcase + 287:5 error Identifier 'site_ID' is not in camel case camelcase + 288:5 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 290:5 error Identifier 'user_ID' is not in camel case camelcase + 295:1 error Line 295 exceeds the maximum line length of 100 max-len + 296:45 error Identifier 'edit_others_posts' is not in camel case camelcase + 302:5 error Identifier 'site_ID' is not in camel case camelcase + 303:5 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 305:5 error Identifier 'user_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sharing/selectors.js + 26:24 error Identifier 'keyring_connection_ID' is not in camel case camelcase + 26:47 error Identifier 'external_ID' is not in camel case camelcase + 34:49 error Identifier 'keyring_connection_ID' is not in camel case camelcase + 34:49 error Identifier 'keyring_connection_ID' is not in camel case camelcase + 34:72 error Identifier 'external_ID' is not in camel case camelcase + 34:72 error Identifier 'external_ID' is not in camel case camelcase + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sharing/services/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sharing/services/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sharing/services/schema.js + 21:5 error Identifier 'connect_URL' is not in camel case camelcase + 25:5 error Identifier 'jetpack_module_required' is not in camel case camelcase + 26:5 error Identifier 'jetpack_support' is not in camel case camelcase + 28:5 error Identifier 'multiple_external_user_ID_support' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/services/test/actions.js + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sharing/services/test/reducer.js + 26:3 error Identifier 'connect_URL' is not in camel case camelcase + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + 33:3 error Identifier 'jetpack_module_required' is not in camel case camelcase + 34:3 error Identifier 'jetpack_support' is not in camel case camelcase + 36:3 error Identifier 'multiple_external_user_ID_support' is not in camel case camelcase + 41:3 error Identifier 'connect_URL' is not in camel case camelcase + 48:1 error Line 48 exceeds the maximum line length of 100 max-len + 49:3 error Identifier 'jetpack_module_required' is not in camel case camelcase + 50:3 error Identifier 'jetpack_support' is not in camel case camelcase + 52:3 error Identifier 'multiple_external_user_ID_support' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/services/test/selectors.js + 35:7 error Identifier 'jetpack_support' is not in camel case camelcase + 40:7 error Identifier 'jetpack_support' is not in camel case camelcase + 45:7 error Identifier 'jetpack_support' is not in camel case camelcase + 47:7 error Identifier 'jetpack_module_required' is not in camel case camelcase + 68:6 error Identifier 'jetpack_support' is not in camel case camelcase + 73:6 error Identifier 'jetpack_support' is not in camel case camelcase + 78:6 error Identifier 'jetpack_support' is not in camel case camelcase + 79:6 error Identifier 'jetpack_module_required' is not in camel case camelcase + 97:42 error Identifier 'jetpack_support' is not in camel case camelcase + 98:41 error Identifier 'jetpack_support' is not in camel case camelcase + 123:7 error Identifier 'manage_options' is not in camel case camelcase + 124:7 error Identifier 'publish_posts' is not in camel case camelcase + 135:8 error Identifier 'unmapped_url' is not in camel case camelcase + 136:8 error Identifier 'active_modules' is not in camel case camelcase + 157:42 error Identifier 'jetpack_support' is not in camel case camelcase + 158:41 error Identifier 'jetpack_support' is not in camel case camelcase + 163:46 error Identifier 'manage_options' is not in camel case camelcase + 165:46 error Identifier 'manage_options' is not in camel case camelcase + 171:46 error Identifier 'publish_posts' is not in camel case camelcase + 173:46 error Identifier 'publish_posts' is not in camel case camelcase + 184:6 error Identifier 'jetpack_support' is not in camel case camelcase + 185:6 error Identifier 'jetpack_module_required' is not in camel case camelcase + 192:41 error Identifier 'active_modules' is not in camel case camelcase + 194:41 error Identifier 'active_modules' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sharing/test/selectors.js + 21:1 error Line 21 exceeds the maximum line length of 100 max-len + 21:60 error Identifier 'additional_external_users' is not in camel case camelcase + 26:7 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + 27:7 error Identifier 'additional_external_users' is not in camel case camelcase + 34:7 error Identifier 'additional_external_users' is not in camel case camelcase + 41:7 error Identifier 'additional_external_users' is not in camel case camelcase + 43:9 error Identifier 'external_ID' is not in camel case camelcase + 44:9 error Identifier 'external_name' is not in camel case camelcase + 45:9 error Identifier 'external_profile_picture' is not in camel case camelcase + 57:18 error Identifier 'site_ID' is not in camel case camelcase + 58:18 error Identifier 'site_ID' is not in camel case camelcase + 58:36 error Identifier 'keyring_connection_user_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/shortcodes/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/shortcodes/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/shortcodes/test/reducer.js + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 51:6 error Identifier 'test_shortcode' is not in camel case camelcase + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 70:6 error Identifier 'another_shortcode' is not in camel case camelcase + 79:7 error Identifier 'test_shortcode' is not in camel case camelcase + 91:6 error Identifier 'test_shortcode' is not in camel case camelcase + 94:6 error Identifier 'another_shortcode' is not in camel case camelcase + 103:7 error Identifier 'test_shortcode' is not in camel case camelcase + 106:7 error Identifier 'another_shortcode' is not in camel case camelcase + 118:6 error Identifier 'test_shortcode' is not in camel case camelcase + 119:6 error Identifier 'some_shortcode' is not in camel case camelcase + 122:6 error Identifier 'another_shortcode' is not in camel case camelcase + 127:1 error Line 127 exceeds the maximum line length of 100 max-len + 131:7 error Identifier 'test_shortcode' is not in camel case camelcase + 132:7 error Identifier 'another_shortcode' is not in camel case camelcase + 135:7 error Identifier 'test_shortcode' is not in camel case camelcase + 147:6 error Identifier 'test_shortcode' is not in camel case camelcase + 148:6 error Identifier 'another_shortcode' is not in camel case camelcase + 151:6 error Identifier 'test_shortcode' is not in camel case camelcase + 156:1 error Line 156 exceeds the maximum line length of 100 max-len + 160:7 error Identifier 'test_shortcode' is not in camel case camelcase + 161:7 error Identifier 'another_shortcode' is not in camel case camelcase + 164:7 error Identifier 'test_shortcode' is not in camel case camelcase + 177:6 error Identifier 'test_shortcode' is not in camel case camelcase + 178:6 error Identifier 'another_shortcode' is not in camel case camelcase + 181:6 error Identifier 'test_shortcode' is not in camel case camelcase + 190:7 error Identifier 'test_shortcode' is not in camel case camelcase + 205:7 error Identifier 'test_shortcode' is not in camel case camelcase + 244:6 error Identifier 'test_shortcode' is not in camel case camelcase + 249:1 error Line 249 exceeds the maximum line length of 100 max-len + 264:6 error Identifier 'test_shortcode' is not in camel case camelcase + 273:7 error Identifier 'test_shortcode' is not in camel case camelcase + 286:6 error Identifier 'test_shortcode' is not in camel case camelcase + 289:6 error Identifier 'test_shortcode' is not in camel case camelcase + 298:7 error Identifier 'test_shortcode' is not in camel case camelcase + 301:7 error Identifier 'test_shortcode' is not in camel case camelcase + 314:6 error Identifier 'test_shortcode' is not in camel case camelcase + 315:6 error Identifier 'another_shortcode' is not in camel case camelcase + 318:6 error Identifier 'test_shortcode' is not in camel case camelcase + 327:7 error Identifier 'test_shortcode' is not in camel case camelcase + 330:7 error Identifier 'test_shortcode' is not in camel case camelcase + 343:6 error Identifier 'test_shortcode' is not in camel case camelcase + 346:6 error Identifier 'test_shortcode' is not in camel case camelcase + 355:7 error Identifier 'test_shortcode' is not in camel case camelcase + 358:7 error Identifier 'test_shortcode' is not in camel case camelcase + 368:6 error Identifier 'test_shortcode' is not in camel case camelcase + 371:6 error Identifier 'test_shortcode' is not in camel case camelcase + 380:7 error Identifier 'test_shortcode' is not in camel case camelcase + 383:7 error Identifier 'test_shortcode' is not in camel case camelcase + 393:6 error Identifier 'test_shortcode' is not in camel case camelcase + 396:6 error Identifier 'test_shortcode' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/shortcodes/test/selectors.js + 21:9 error Identifier 'test_shortcode' is not in camel case camelcase + 39:9 error Identifier 'test_shortcode' is not in camel case camelcase + 57:9 error Identifier 'test_shortcode' is not in camel case camelcase + 75:9 error Identifier 'test_shortcode' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/signup/dependency-store/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/dependency-store/schema.js + 12:7 error Identifier 'product_slug' is not in camel case camelcase + 13:7 error Identifier 'free_trial' is not in camel case camelcase + 26:7 error Identifier 'is_domain_registration' is not in camel case camelcase + 27:7 error Identifier 'product_slug' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/signup/dependency-store/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/optional-dependencies/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/optional-dependencies/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/steps/design-type/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/steps/design-type/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/steps/design-type/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/steps/jpo-connect/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 15:39 error 'state' is assigned a value but never used no-unused-vars + +/Users/seear/repos/wp-calypso/client/state/signup/steps/jpo-connect/schema.js + 18:7 error Identifier '_wp_nonce' is not in camel case camelcase + 22:7 error Identifier 'calypso_env' is not in camel case camelcase + 23:7 error Identifier 'client_id' is not in camel case camelcase + 25:7 error Identifier 'home_url' is not in camel case camelcase + 26:7 error Identifier 'jp_version' is not in camel case camelcase + 29:7 error Identifier 'redirect_after_auth' is not in camel case camelcase + 30:7 error Identifier 'redirect_uri' is not in camel case camelcase + 34:7 error Identifier 'site_icon' is not in camel case camelcase + 35:7 error Identifier 'site_lang' is not in camel case camelcase + 36:7 error Identifier 'site_url' is not in camel case camelcase + 38:7 error Identifier 'user_email' is not in camel case camelcase + 39:7 error Identifier 'user_login' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/signup/steps/jpo-connect/test/reducer.js + 17:19 error Identifier 'client_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/signup/steps/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/steps/site-title/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/steps/site-title/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/steps/site-title/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/steps/survey/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/steps/survey/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/signup/steps/survey/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/simple-payments/product-list/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/simple-payments/product-list/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/simple-payments/product-list/schema.js + 11:2 error Identifier 'formatted_price' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/simple-payments/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/site-roles/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/site-roles/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/site-roles/schema.js + 11:6 error Identifier 'display_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-roles/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/site-roles/test/actions.js + 30:6 error Identifier 'display_name' is not in camel case camelcase + 32:7 error Identifier 'activate_plugins' is not in camel case camelcase + 33:7 error Identifier 'edit_users' is not in camel case camelcase + 34:7 error Identifier 'manage_options' is not in camel case camelcase + 39:6 error Identifier 'display_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-roles/test/reducer.js + 112:5 error Identifier 'display_name' is not in camel case camelcase + 114:6 error Identifier 'activate_plugins' is not in camel case camelcase + 115:6 error Identifier 'edit_users' is not in camel case camelcase + 116:6 error Identifier 'manage_options' is not in camel case camelcase + 121:5 error Identifier 'display_name' is not in camel case camelcase + 130:5 error Identifier 'display_name' is not in camel case camelcase + 133:6 error Identifier 'level_0' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-roles/test/selectors.js + 65:5 error Identifier 'display_name' is not in camel case camelcase + 67:6 error Identifier 'activate_plugins' is not in camel case camelcase + 68:6 error Identifier 'edit_users' is not in camel case camelcase + 69:6 error Identifier 'manage_options' is not in camel case camelcase + 74:5 error Identifier 'display_name' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-settings/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/site-settings/exporter/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/site-settings/exporter/reducers.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/site-settings/exporter/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 70:4 error Identifier 'start_date' is not in camel case camelcase + 71:4 error Identifier 'end_date' is not in camel case camelcase + 119:26 error Identifier 'post_type' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-settings/exporter/test/actions.js + 72:5 error Identifier 'post_type' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-settings/exporter/test/data/index.js + 40:2 error Identifier 'export_file_lifetime_days' is not in camel case camelcase + 41:2 error Identifier '$attachment_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-settings/exporter/test/selectors.js + 31:9 error Strings must use singlequote quotes + 72:10 error Identifier 'start_date' is not in camel case camelcase + 73:10 error Identifier 'end_date' is not in camel case camelcase + 91:10 error Identifier 'start_date' is not in camel case camelcase + 92:10 error Identifier 'end_date' is not in camel case camelcase + 110:10 error Identifier 'start_date' is not in camel case camelcase + 111:10 error Identifier 'end_date' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-settings/reducer.js + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 102:6 error Identifier 'site_icon' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-settings/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/site-settings/test/actions.js + 124:17 error Identifier 'real_update' is not in camel case camelcase + 146:7 error Identifier 'real_update' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-settings/test/reducer.js + 210:23 error Identifier 'default_category' is not in camel case camelcase + 223:23 error Identifier 'default_category' is not in camel case camelcase + 225:16 error Identifier 'default_category' is not in camel case camelcase + 234:16 error Identifier 'default_category' is not in camel case camelcase + 240:23 error Identifier 'default_category' is not in camel case camelcase + 242:16 error Identifier 'default_category' is not in camel case camelcase + 255:1 error Line 255 exceeds the maximum line length of 100 max-len + 256:44 error Identifier 'lang_id' is not in camel case camelcase + 267:62 error Identifier 'lang_id' is not in camel case camelcase + 282:1 error Line 282 exceeds the maximum line length of 100 max-len + 286:6 error Identifier 'site_icon' is not in camel case camelcase + 302:6 error Identifier 'site_icon' is not in camel case camelcase + 314:6 error Identifier 'site_icon' is not in camel case camelcase + 321:16 error Identifier 'default_category' is not in camel case camelcase + 326:16 error Identifier 'default_category' is not in camel case camelcase + 332:16 error Identifier 'default_category' is not in camel case camelcase + 337:16 error Identifier 'default_category' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-settings/test/selectors.js + 244:18 error Identifier 'default_category' is not in camel case camelcase + 257:18 error Identifier 'default_category' is not in camel case camelcase + 263:33 error Identifier 'default_category' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/site-settings/test/utils.js + 17:5 error Identifier 'chicken_ribs' is not in camel case camelcase + 21:5 error Identifier 'chicken_ribs' is not in camel case camelcase + 27:5 error Identifier 'default_category' is not in camel case camelcase + 31:5 error Identifier 'default_category' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/actions.js + 34:1 error Line 34 exceeds the maximum line length of 100 max-len + 100:5 error Identifier 'site_visibility' is not in camel case camelcase + 101:5 error Identifier 'include_domain_only' is not in camel case camelcase + 102:5 error Identifier 'site_activity' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/blog-stickers/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/connection/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/connection/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/connection/test/actions.js + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/domains/assembler.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/domains/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/domains/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/domains/test/fixture/index.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 108:2 error Identifier 'auto_renewal_date' is not in camel case camelcase + 109:2 error Identifier 'auto_renewing' is not in camel case camelcase + 110:2 error Identifier 'blog_id' is not in camel case camelcase + 111:2 error Identifier 'can_set_as_primary' is not in camel case camelcase + 113:2 error Identifier 'domain_locking_available' is not in camel case camelcase + 114:2 error Identifier 'points_to_wpcom' is not in camel case camelcase + 117:2 error Identifier 'expiry_soon' is not in camel case camelcase + 118:2 error Identifier 'google_apps_subscription' is not in camel case camelcase + 121:2 error Identifier 'has_private_registration' is not in camel case camelcase + 123:2 error Identifier 'has_registration' is not in camel case camelcase + 124:2 error Identifier 'has_zone' is not in camel case camelcase + 125:2 error Identifier 'current_user_can_manage' is not in camel case camelcase + 126:2 error Identifier 'is_pending_icann_verification' is not in camel case camelcase + 127:2 error Identifier 'manual_transfer_required' is not in camel case camelcase + 128:2 error Identifier 'new_registration' is not in camel case camelcase + 130:2 error Identifier 'partner_domain' is not in camel case camelcase + 131:2 error Identifier 'pending_registration' is not in camel case camelcase + 132:2 error Identifier 'pending_registration_time' is not in camel case camelcase + 133:2 error Identifier 'pending_whois_update' is not in camel case camelcase + 134:2 error Identifier 'primary_domain' is not in camel case camelcase + 135:2 error Identifier 'private_domain' is not in camel case camelcase + 137:2 error Identifier 'registration_date' is not in camel case camelcase + 138:2 error Identifier 'subscription_id' is not in camel case camelcase + 140:2 error Identifier 'transfer_lock_on_whois_update_optional' is not in camel case camelcase + 141:2 error Identifier 'whois_update_unmodifiable_fields' is not in camel case camelcase + 142:2 error Identifier 'wpcom_domain' is not in camel case camelcase + 146:2 error Identifier 'auto_renewal_date' is not in camel case camelcase + 147:2 error Identifier 'auto_renewing' is not in camel case camelcase + 148:2 error Identifier 'blog_id' is not in camel case camelcase + 149:2 error Identifier 'can_set_as_primary' is not in camel case camelcase + 151:2 error Identifier 'domain_locking_available' is not in camel case camelcase + 152:2 error Identifier 'points_to_wpcom' is not in camel case camelcase + 155:2 error Identifier 'expiry_soon' is not in camel case camelcase + 156:2 error Identifier 'google_apps_subscription' is not in camel case camelcase + 159:2 error Identifier 'has_private_registration' is not in camel case camelcase + 161:2 error Identifier 'has_registration' is not in camel case camelcase + 162:2 error Identifier 'has_zone' is not in camel case camelcase + 163:2 error Identifier 'current_user_can_manage' is not in camel case camelcase + 164:2 error Identifier 'is_pending_icann_verification' is not in camel case camelcase + 165:2 error Identifier 'manual_transfer_required' is not in camel case camelcase + 166:2 error Identifier 'new_registration' is not in camel case camelcase + 167:2 error Identifier 'partner_domain' is not in camel case camelcase + 168:2 error Identifier 'pending_registration' is not in camel case camelcase + 169:2 error Identifier 'pending_registration_time' is not in camel case camelcase + 170:2 error Identifier 'pending_whois_update' is not in camel case camelcase + 171:2 error Identifier 'primary_domain' is not in camel case camelcase + 172:2 error Identifier 'private_domain' is not in camel case camelcase + 174:2 error Identifier 'registration_date' is not in camel case camelcase + 175:2 error Identifier 'subscription_id' is not in camel case camelcase + 177:2 error Identifier 'whois_update_unmodifiable_fields' is not in camel case camelcase + 178:2 error Identifier 'wpcom_domain' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/domains/test/reducer.js + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/enhancer.js + 31:16 error 'lib/sites-list' module is restricted from being used no-restricted-modules + +/Users/seear/repos/wp-calypso/client/state/sites/guided-transfer/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/guided-transfer/schema.js + 15:8 error Identifier 'prevents_transfer' is not in camel case camelcase + 19:5 error Identifier 'upgrade_purchased' is not in camel case camelcase + 20:5 error Identifier 'host_details_entered' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/guided-transfer/selectors.js + 2:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/guided-transfer/test/actions.js + 37:3 error Identifier 'upgrade_purchased' is not in camel case camelcase + 38:3 error Identifier 'host_details_entered' is not in camel case camelcase + 44:3 error Identifier 'upgrade_purchased' is not in camel case camelcase + 45:3 error Identifier 'host_details_entered' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/guided-transfer/test/reducer.js + 51:5 error Identifier 'upgrade_purchased' is not in camel case camelcase + 52:5 error Identifier 'host_details_entered' is not in camel case camelcase + 71:7 error Identifier 'upgrade_purchased' is not in camel case camelcase + 72:7 error Identifier 'host_details_entered' is not in camel case camelcase + 82:7 error Identifier 'upgrade_purchased' is not in camel case camelcase + 83:7 error Identifier 'host_details_entered' is not in camel case camelcase + 92:6 error Identifier 'invalid_id' is not in camel case camelcase + 93:7 error Identifier 'upgrade_purchased' is not in camel case camelcase + 94:7 error Identifier 'host_details_entered' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/guided-transfer/test/selectors.js + 89:38 error Identifier 'prevents_transfer' is not in camel case camelcase + 90:42 error Identifier 'prevents_transfer' is not in camel case camelcase + 91:46 error Identifier 'prevents_transfer' is not in camel case camelcase + 102:6 error Identifier 'prevents_transfer' is not in camel case camelcase + 104:46 error Identifier 'prevents_transfer' is not in camel case camelcase + 108:46 error Identifier 'prevents_transfer' is not in camel case camelcase + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 110:57 error Identifier 'prevents_transfer' is not in camel case camelcase + 112:5 error Identifier 'prevents_transfer' is not in camel case camelcase + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + 115:57 error Identifier 'prevents_transfer' is not in camel case camelcase + 117:5 error Identifier 'prevents_transfer' is not in camel case camelcase + 129:44 error Identifier 'prevents_transfer' is not in camel case camelcase + 144:41 error Identifier 'prevents_transfer' is not in camel case camelcase + 172:46 error Identifier 'prevents_transfer' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/media-storage/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/media-storage/schema.js + 10:5 error Identifier 'max_storage_bytes' is not in camel case camelcase + 11:5 error Identifier 'storage_used_bytes' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/media-storage/test/actions.js + 33:5 error Identifier 'max_storage_bytes' is not in camel case camelcase + 34:5 error Identifier 'storage_used_bytes' is not in camel case camelcase + 45:2 error Test suite title is used multiple times jest/no-identical-title + 51:6 error Identifier 'max_storage_bytes' is not in camel case camelcase + 52:6 error Identifier 'storage_used_bytes' is not in camel case camelcase + 74:7 error Identifier 'max_storage_bytes' is not in camel case camelcase + 75:7 error Identifier 'storage_used_bytes' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/media-storage/test/reducer.js + 48:5 error Identifier 'max_storage_bytes' is not in camel case camelcase + 49:5 error Identifier 'storage_used_bytes' is not in camel case camelcase + 65:6 error Identifier 'max_storage_bytes' is not in camel case camelcase + 66:6 error Identifier 'storage_used_bytes' is not in camel case camelcase + 72:6 error Identifier 'max_storage_bytes' is not in camel case camelcase + 73:6 error Identifier 'storage_used_bytes' is not in camel case camelcase + 80:6 error Identifier 'max_storage_bytes' is not in camel case camelcase + 81:6 error Identifier 'storage_used_bytes' is not in camel case camelcase + 84:6 error Identifier 'max_storage_bytes' is not in camel case camelcase + 85:6 error Identifier 'storage_used_bytes' is not in camel case camelcase + 93:6 error Identifier 'max_storage_bytes' is not in camel case camelcase + 94:6 error Identifier 'storage_used_bytes' is not in camel case camelcase + 97:6 error Identifier 'max_storage_bytes' is not in camel case camelcase + 98:6 error Identifier 'storage_used_bytes' is not in camel case camelcase + 104:6 error Identifier 'max_storage_bytes' is not in camel case camelcase + 105:6 error Identifier 'storage_used_bytes' is not in camel case camelcase + 112:6 error Identifier 'max_storage_bytes' is not in camel case camelcase + 113:6 error Identifier 'storage_used_bytes' is not in camel case camelcase + 116:6 error Identifier 'max_storage_bytes' is not in camel case camelcase + 117:6 error Identifier 'storage_used_bytes' is not in camel case camelcase + 126:7 error Identifier 'max_storage_bytes' is not in camel case camelcase + 127:7 error Identifier 'storage_used_bytes' is not in camel case camelcase + 130:7 error Identifier 'max_storage_bytes' is not in camel case camelcase + 131:7 error Identifier 'storage_used_bytes' is not in camel case camelcase + 141:7 error Identifier 'max_storage_bytes' is not in camel case camelcase + 142:7 error Identifier 'storage_used_bytes' is not in camel case camelcase + 145:7 error Identifier 'max_storage_bytes' is not in camel case camelcase + 146:7 error Identifier 'storage_used_bytes' is not in camel case camelcase + 156:7 error Identifier 'max_storage_bytes' is not in camel case camelcase + 157:7 error Identifier 'storage_used_bytes' is not in camel case camelcase + 160:7 error Identifier 'max_storage_bytes' is not in camel case camelcase + 161:7 error Identifier 'storage_used_bytes' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/media-storage/test/selectors.js + 21:9 error Identifier 'max_storage_bytes' is not in camel case camelcase + 22:9 error Identifier 'storage_used_bytes' is not in camel case camelcase + 25:9 error Identifier 'max_storage_bytes' is not in camel case camelcase + 26:9 error Identifier 'storage_used_bytes' is not in camel case camelcase + 35:5 error Identifier 'max_storage_bytes' is not in camel case camelcase + 36:5 error Identifier 'storage_used_bytes' is not in camel case camelcase + 65:9 error Identifier 'max_storage_bytes' is not in camel case camelcase + 66:9 error Identifier 'storage_used_bytes' is not in camel case camelcase + 69:9 error Identifier 'max_storage_bytes' is not in camel case camelcase + 70:9 error Identifier 'storage_used_bytes' is not in camel case camelcase + 86:9 error Identifier 'max_storage_bytes' is not in camel case camelcase + 87:9 error Identifier 'storage_used_bytes' is not in camel case camelcase + 102:9 error Identifier 'max_storage_bytes' is not in camel case camelcase + 103:9 error Identifier 'storage_used_bytes' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/monitor/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 65:11 error Identifier 'email_notifications' is not in camel case camelcase + 65:32 error Identifier 'wp_note_notifications' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/monitor/test/actions.js + 35:5 error Identifier 'email_notifications' is not in camel case camelcase + 36:5 error Identifier 'monitor_active' is not in camel case camelcase + 37:5 error Identifier 'wp_note_notifications' is not in camel case camelcase + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 75:1 error Line 75 exceeds the maximum line length of 100 max-len + 100:4 error Identifier 'email_notifications' is not in camel case camelcase + 101:4 error Identifier 'wp_note_notifications' is not in camel case camelcase + 105:4 error Identifier 'monitor_active' is not in camel case camelcase + 140:1 error Line 140 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/monitor/test/reducer.js + 37:4 error Identifier 'email_notifications' is not in camel case camelcase + 38:4 error Identifier 'monitor_active' is not in camel case camelcase + 39:4 error Identifier 'wp_note_notifications' is not in camel case camelcase + 43:4 error Identifier 'wp_note_notifications' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/plans/actions.js + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 108:1 error Line 108 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/plans/assembler.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/plans/selectors.js + 140:1 error Line 140 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/plans/test/reducer.js + 24:1 error Line 24 exceeds the maximum line length of 100 max-len + 37:1 error Line 37 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + 175:1 error Line 175 exceeds the maximum line length of 100 max-len + 199:1 error Line 199 exceeds the maximum line length of 100 max-len + 224:1 error Line 224 exceeds the maximum line length of 100 max-len + 241:1 error Line 241 exceeds the maximum line length of 100 max-len + 250:1 error Line 250 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/plans/test/selectors.js + 540:1 error Line 540 exceeds the maximum line length of 100 max-len + 577:1 error Line 577 exceeds the maximum line length of 100 max-len + 743:1 error Line 743 exceeds the maximum line length of 100 max-len + 866:1 error Line 866 exceeds the maximum line length of 100 max-len + 889:1 error Line 889 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/reducer.js + 127:7 error Identifier 'theme_slug' is not in camel case camelcase + 147:1 error Line 147 exceeds the maximum line length of 100 max-len + 163:9 error Identifier 'is_private' is not in camel case camelcase + 187:11 error Identifier 'media_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/schema.js + 19:7 error Identifier 'media_id' is not in camel case camelcase + 23:5 error Identifier 'is_private' is not in camel case camelcase + 24:5 error Identifier 'is_vip' is not in camel case camelcase + 27:5 error Identifier 'is_multisite' is not in camel case camelcase + 38:7 error Identifier 'product_id' is not in camel case camelcase + 39:7 error Identifier 'product_slug' is not in camel case camelcase + 40:7 error Identifier 'product_name_short' is not in camel case camelcase + 41:7 error Identifier 'free_trial' is not in camel case camelcase + 43:7 error Identifier 'user_is_owner' is not in camel case camelcase + 44:7 error Identifier 'is_free' is not in camel case camelcase + 47:5 error Identifier 'single_user_site' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/selectors.js + 131:1 error Line 131 exceeds the maximum line length of 100 max-len + 477:1 error Line 477 exceeds the maximum line length of 100 max-len + 495:5 error Identifier 'product_id' is not in camel case camelcase + 496:5 error Identifier 'product_slug' is not in camel case camelcase + 497:5 error Identifier 'product_name_short' is not in camel case camelcase + 498:5 error Identifier 'free_trial' is not in camel case camelcase + 504:4 error Identifier 'product_id' is not in camel case camelcase + 505:4 error Identifier 'product_slug' is not in camel case camelcase + 506:4 error Identifier 'product_name_short' is not in camel case camelcase + 507:4 error Identifier 'free_trial' is not in camel case camelcase + 668:1 error Line 668 exceeds the maximum line length of 100 max-len + 917:1 error Line 917 exceeds the maximum line length of 100 max-len + 930:1 error Line 930 exceeds the maximum line length of 100 max-len + 1013:4 error Unquoted reserved word 'return' used as key quote-props + 1062:1 error Line 1062 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/sharing-buttons/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/sharing-buttons/test/actions.js + 66:6 error Identifier 'sharing_buttons' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/sharing-buttons/test/reducer.js + 253:1 error Line 253 exceeds the maximum line length of 100 max-len + 259:1 error Line 259 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/test/reducer.js + 291:1 error Line 291 exceeds the maximum line length of 100 max-len + 327:7 error Identifier 'theme_slug' is not in camel case camelcase + 342:7 error Identifier 'theme_slug' is not in camel case camelcase + 359:1 error Line 359 exceeds the maximum line length of 100 max-len + 365:6 error Identifier 'site_icon' is not in camel case camelcase + 378:7 error Identifier 'media_id' is not in camel case camelcase + 386:6 error Identifier 'site_icon' is not in camel case camelcase + 393:1 error Line 393 exceeds the maximum line length of 100 max-len + 398:6 error Identifier 'is_private' is not in camel case camelcase + 405:6 error Identifier 'blog_public' is not in camel case camelcase + 423:6 error Identifier 'site_icon' is not in camel case camelcase + 430:1 error Line 430 exceeds the maximum line length of 100 max-len + 436:1 error Line 436 exceeds the maximum line length of 100 max-len + 437:1 error Line 437 exceeds the maximum line length of 100 max-len + 445:6 error Identifier 'site_icon' is not in camel case camelcase + 463:7 error Identifier 'media_id' is not in camel case camelcase + 471:6 error Identifier 'site_icon' is not in camel case camelcase + 483:1 error Line 483 exceeds the maximum line length of 100 max-len + 494:6 error Identifier 'site_icon' is not in camel case camelcase + 503:7 error Identifier 'media_id' is not in camel case camelcase + 514:6 error Identifier 'is_private' is not in camel case camelcase + 521:6 error Identifier 'blog_public' is not in camel case camelcase + 529:6 error Identifier 'is_private' is not in camel case camelcase + 545:6 error Identifier 'blog_public' is not in camel case camelcase + 546:6 error Identifier 'site_icon' is not in camel case camelcase + 554:6 error Identifier 'is_private' is not in camel case camelcase + 556:7 error Identifier 'media_id' is not in camel case camelcase + 562:1 error Line 562 exceeds the maximum line length of 100 max-len + 568:7 error Identifier 'media_id' is not in camel case camelcase + 581:1 error Line 581 exceeds the maximum line length of 100 max-len + 587:7 error Identifier 'media_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/test/selectors.js + 147:10 error Identifier 'unmapped_url' is not in camel case camelcase + 167:5 error Identifier 'is_customizable' is not in camel case camelcase + 168:5 error Identifier 'is_previewable' is not in camel case camelcase + 170:6 error Identifier 'default_post_format' is not in camel case camelcase + 171:6 error Identifier 'unmapped_url' is not in camel case camelcase + 176:1 error Line 176 exceeds the maximum line length of 100 max-len + 188:10 error Identifier 'unmapped_url' is not in camel case camelcase + 197:10 error Identifier 'unmapped_url' is not in camel case camelcase + 218:5 error Identifier 'is_customizable' is not in camel case camelcase + 219:5 error Identifier 'is_previewable' is not in camel case camelcase + 221:6 error Identifier 'default_post_format' is not in camel case camelcase + 222:6 error Identifier 'unmapped_url' is not in camel case camelcase + 270:1 error Line 270 exceeds the maximum line length of 100 max-len + 286:1 error Line 286 exceeds the maximum line length of 100 max-len + 327:9 error Identifier 'single_user_site' is not in camel case camelcase + 350:9 error Identifier 'single_user_site' is not in camel case camelcase + 399:1 error Line 399 exceeds the maximum line length of 100 max-len + 456:10 error Identifier 'active_modules' is not in camel case camelcase + 479:10 error Identifier 'active_modules' is not in camel case camelcase + 558:10 error Identifier 'jetpack_version' is not in camel case camelcase + 581:10 error Identifier 'jetpack_version' is not in camel case camelcase + 618:10 error Identifier 'is_redirect' is not in camel case camelcase + 619:10 error Identifier 'unmapped_url' is not in camel case camelcase + 641:10 error Identifier 'is_redirect' is not in camel case camelcase + 642:10 error Identifier 'unmapped_url' is not in camel case camelcase + 715:10 error Identifier 'is_redirect' is not in camel case camelcase + 716:10 error Identifier 'unmapped_url' is not in camel case camelcase + 738:10 error Identifier 'is_redirect' is not in camel case camelcase + 739:10 error Identifier 'unmapped_url' is not in camel case camelcase + 824:11 error Identifier 'unmapped_url' is not in camel case camelcase + 866:10 error Identifier 'is_vip' is not in camel case camelcase + 868:11 error Identifier 'unmapped_url' is not in camel case camelcase + 907:11 error Identifier 'unmapped_url' is not in camel case camelcase + 928:11 error Identifier 'unmapped_url' is not in camel case camelcase + 985:10 error Identifier 'unmapped_url' is not in camel case camelcase + 1007:10 error Identifier 'example_option' is not in camel case camelcase + 1111:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1132:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1134:11 error Identifier 'front_page' is not in camel case camelcase + 1191:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1192:11 error Identifier 'front_page' is not in camel case camelcase + 1223:1 error Line 1223 exceeds the maximum line length of 100 max-len + 1232:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1233:11 error Identifier 'front_page' is not in camel case camelcase + 1262:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1313:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1337:1 error Line 1337 exceeds the maximum line length of 100 max-len + 1346:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1377:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1419:1 error Line 1419 exceeds the maximum line length of 100 max-len + 1428:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1452:1 error Line 1452 exceeds the maximum line length of 100 max-len + 1461:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1492:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1532:1 error Line 1532 exceeds the maximum line length of 100 max-len + 1541:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1571:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1611:1 error Line 1611 exceeds the maximum line length of 100 max-len + 1620:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1650:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1681:10 error Identifier 'advanced_seo_title_formats' is not in camel case camelcase + 1757:9 error Identifier 'unmapped_url' is not in camel case camelcase + 1758:9 error Identifier 'is_redirect' is not in camel case camelcase + 1815:1 error Line 1815 exceeds the maximum line length of 100 max-len + 1843:10 error Identifier 'product_id' is not in camel case camelcase + 1844:10 error Identifier 'product_slug' is not in camel case camelcase + 1845:10 error Identifier 'product_name_short' is not in camel case camelcase + 1846:10 error Identifier 'free_trial' is not in camel case camelcase + 1856:5 error Identifier 'product_id' is not in camel case camelcase + 1857:5 error Identifier 'product_slug' is not in camel case camelcase + 1858:5 error Identifier 'product_name_short' is not in camel case camelcase + 1859:5 error Identifier 'free_trial' is not in camel case camelcase + 1871:10 error Identifier 'product_id' is not in camel case camelcase + 1872:10 error Identifier 'product_slug' is not in camel case camelcase + 1873:10 error Identifier 'product_name_short' is not in camel case camelcase + 1874:10 error Identifier 'free_trial' is not in camel case camelcase + 1885:5 error Identifier 'product_id' is not in camel case camelcase + 1886:5 error Identifier 'product_slug' is not in camel case camelcase + 1887:5 error Identifier 'product_name_short' is not in camel case camelcase + 1888:5 error Identifier 'free_trial' is not in camel case camelcase + 1902:10 error Identifier 'product_id' is not in camel case camelcase + 1903:10 error Identifier 'product_slug' is not in camel case camelcase + 1904:10 error Identifier 'product_name_short' is not in camel case camelcase + 1905:10 error Identifier 'free_trial' is not in camel case camelcase + 1916:5 error Identifier 'product_id' is not in camel case camelcase + 1917:5 error Identifier 'product_slug' is not in camel case camelcase + 1918:5 error Identifier 'product_name_short' is not in camel case camelcase + 1919:5 error Identifier 'free_trial' is not in camel case camelcase + 1947:10 error Identifier 'product_id' is not in camel case camelcase + 1948:10 error Identifier 'product_slug' is not in camel case camelcase + 1984:10 error Identifier 'product_id' is not in camel case camelcase + 2004:10 error Identifier 'product_id' is not in camel case camelcase + 2017:1 error Line 2017 exceeds the maximum line length of 100 max-len + 2025:10 error Identifier 'product_id' is not in camel case camelcase + 2048:10 error Identifier 'product_id' is not in camel case camelcase + 2068:10 error Identifier 'product_id' is not in camel case camelcase + 2139:10 error Identifier 'theme_slug' is not in camel case camelcase + 2161:10 error Identifier 'theme_slug' is not in camel case camelcase + 2183:10 error Identifier 'theme_slug' is not in camel case camelcase + 2193:1 error Line 2193 exceeds the maximum line length of 100 max-len + 2198:1 error Line 2198 exceeds the maximum line length of 100 max-len + 2207:10 error Identifier 'show_on_front' is not in camel case camelcase + 2208:10 error Identifier 'page_on_front' is not in camel case camelcase + 2233:1 error Line 2233 exceeds the maximum line length of 100 max-len + 2242:10 error Identifier 'show_on_front' is not in camel case camelcase + 2243:10 error Identifier 'page_on_front' is not in camel case camelcase + 2257:1 error Line 2257 exceeds the maximum line length of 100 max-len + 2266:10 error Identifier 'show_on_front' is not in camel case camelcase + 2267:10 error Identifier 'page_on_front' is not in camel case camelcase + 2288:10 error Identifier 'show_on_front' is not in camel case camelcase + 2322:10 error Identifier 'show_on_front' is not in camel case camelcase + 2323:10 error Identifier 'page_on_front' is not in camel case camelcase + 2337:1 error Line 2337 exceeds the maximum line length of 100 max-len + 2346:10 error Identifier 'show_on_front' is not in camel case camelcase + 2347:10 error Identifier 'page_on_front' is not in camel case camelcase + 2348:10 error Identifier 'page_for_posts' is not in camel case camelcase + 2373:1 error Line 2373 exceeds the maximum line length of 100 max-len + 2382:10 error Identifier 'show_on_front' is not in camel case camelcase + 2383:10 error Identifier 'page_on_front' is not in camel case camelcase + 2384:10 error Identifier 'page_for_posts' is not in camel case camelcase + 2420:10 error Identifier 'show_on_front' is not in camel case camelcase + 2421:10 error Identifier 'page_on_front' is not in camel case camelcase + 2422:10 error Identifier 'page_for_posts' is not in camel case camelcase + 2460:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2476:7 error Identifier 'active_modules' is not in camel case camelcase + 2477:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2486:1 error Line 2486 exceeds the maximum line length of 100 max-len + 2493:7 error Identifier 'active_modules' is not in camel case camelcase + 2494:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2503:1 error Line 2503 exceeds the maximum line length of 100 max-len + 2510:7 error Identifier 'active_modules' is not in camel case camelcase + 2511:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2546:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2560:6 error Identifier 'is_multisite' is not in camel case camelcase + 2562:7 error Identifier 'is_multi_network' is not in camel case camelcase + 2563:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2578:6 error Identifier 'is_multisite' is not in camel case camelcase + 2580:7 error Identifier 'is_multi_network' is not in camel case camelcase + 2581:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2582:7 error Identifier 'unmapped_url' is not in camel case camelcase + 2583:7 error Identifier 'main_network_site' is not in camel case camelcase + 2598:6 error Identifier 'is_multisite' is not in camel case camelcase + 2600:7 error Identifier 'is_multi_network' is not in camel case camelcase + 2601:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2602:7 error Identifier 'unmapped_url' is not in camel case camelcase + 2603:7 error Identifier 'main_network_site' is not in camel case camelcase + 2604:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 2619:6 error Identifier 'is_multisite' is not in camel case camelcase + 2621:7 error Identifier 'is_multi_network' is not in camel case camelcase + 2622:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2623:7 error Identifier 'unmapped_url' is not in camel case camelcase + 2624:7 error Identifier 'main_network_site' is not in camel case camelcase + 2625:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 2640:6 error Identifier 'is_multisite' is not in camel case camelcase + 2642:7 error Identifier 'is_multi_network' is not in camel case camelcase + 2643:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2644:7 error Identifier 'unmapped_url' is not in camel case camelcase + 2645:7 error Identifier 'main_network_site' is not in camel case camelcase + 2646:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 2657:1 error Line 2657 exceeds the maximum line length of 100 max-len + 2662:6 error Identifier 'is_multisite' is not in camel case camelcase + 2665:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 2666:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2675:1 error Line 2675 exceeds the maximum line length of 100 max-len + 2680:6 error Identifier 'is_multisite' is not in camel case camelcase + 2683:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 2684:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2695:1 error Line 2695 exceeds the maximum line length of 100 max-len + 2700:6 error Identifier 'is_multisite' is not in camel case camelcase + 2703:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 2704:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2713:1 error Line 2713 exceeds the maximum line length of 100 max-len + 2718:6 error Identifier 'is_multisite' is not in camel case camelcase + 2721:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 2722:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2734:1 error Line 2734 exceeds the maximum line length of 100 max-len + 2757:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2773:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2789:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2807:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2823:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2856:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2875:7 error Identifier 'jetpack_version' is not in camel case camelcase + 2910:9 error Identifier 'is_multisite' is not in camel case camelcase + 2929:9 error Identifier 'is_multisite' is not in camel case camelcase + 2948:9 error Identifier 'is_multisite' is not in camel case camelcase + 2962:1 error Line 2962 exceeds the maximum line length of 100 max-len + 2972:6 error Identifier 'is_multisite' is not in camel case camelcase + 2987:7 error Identifier 'is_multi_network' is not in camel case camelcase + 3002:6 error Identifier 'is_multisite' is not in camel case camelcase + 3004:7 error Identifier 'is_multi_network' is not in camel case camelcase + 3005:7 error Identifier 'main_network_site' is not in camel case camelcase + 3020:6 error Identifier 'is_multisite' is not in camel case camelcase + 3022:7 error Identifier 'is_multi_network' is not in camel case camelcase + 3023:7 error Identifier 'unmapped_url' is not in camel case camelcase + 3032:1 error Line 3032 exceeds the maximum line length of 100 max-len + 3038:6 error Identifier 'is_multisite' is not in camel case camelcase + 3040:7 error Identifier 'unmapped_url' is not in camel case camelcase + 3041:7 error Identifier 'main_network_site' is not in camel case camelcase + 3079:7 error Identifier 'active_modules' is not in camel case camelcase + 3099:7 error Identifier 'active_modules' is not in camel case camelcase + 3140:7 error Identifier 'active_modules' is not in camel case camelcase + 3141:7 error Identifier 'admin_url' is not in camel case camelcase + 3142:7 error Identifier 'jetpack_version' is not in camel case camelcase + 3153:1 error Line 3153 exceeds the maximum line length of 100 max-len + 3160:7 error Identifier 'active_modules' is not in camel case camelcase + 3161:7 error Identifier 'admin_url' is not in camel case camelcase + 3162:7 error Identifier 'jetpack_version' is not in camel case camelcase + 3176:1 error Line 3176 exceeds the maximum line length of 100 max-len + 3187:7 error Identifier 'unmapped_url' is not in camel case camelcase + 3203:7 error Identifier 'unmapped_url' is not in camel case camelcase + 3214:1 error Line 3214 exceeds the maximum line length of 100 max-len + 3220:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 3237:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 3254:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 3259:1 error Line 3259 exceeds the maximum line length of 100 max-len + 3265:1 error Line 3265 exceeds the maximum line length of 100 max-len + 3271:7 error Identifier 'file_mod_disabled' is not in camel case camelcase + 3276:1 error Line 3276 exceeds the maximum line length of 100 max-len + 3285:1 error Line 3285 exceeds the maximum line length of 100 max-len + 3296:7 error Identifier 'is_multi_network' is not in camel case camelcase + 3311:6 error Identifier 'is_multisite' is not in camel case camelcase + 3324:6 error Identifier 'is_multisite' is not in camel case camelcase + 3327:7 error Identifier 'is_multi_network' is not in camel case camelcase + 3328:7 error Identifier 'main_network_site' is not in camel case camelcase + 3342:6 error Identifier 'is_multisite' is not in camel case camelcase + 3345:7 error Identifier 'is_multi_network' is not in camel case camelcase + 3346:7 error Identifier 'unmapped_url' is not in camel case camelcase + 3355:1 error Line 3355 exceeds the maximum line length of 100 max-len + 3360:6 error Identifier 'is_multisite' is not in camel case camelcase + 3363:7 error Identifier 'is_multi_network' is not in camel case camelcase + 3364:7 error Identifier 'unmapped_url' is not in camel case camelcase + 3365:7 error Identifier 'main_network_site' is not in camel case camelcase + 3398:10 error Identifier 'admin_url' is not in camel case camelcase + 3419:10 error Identifier 'admin_url' is not in camel case camelcase + 3441:10 error Identifier 'admin_url' is not in camel case camelcase + 3517:10 error Identifier 'admin_url' is not in camel case camelcase + 3559:10 error Identifier 'admin_url' is not in camel case camelcase + 3597:11 error Identifier 'admin_url' is not in camel case camelcase + 3623:11 error Identifier 'admin_url' is not in camel case camelcase + 3685:10 error Identifier 'jetpack_version' is not in camel case camelcase + 3707:10 error Identifier 'jetpack_version' is not in camel case camelcase + 3729:10 error Identifier 'jetpack_version' is not in camel case camelcase + 3821:8 error Identifier 'manage_options' is not in camel case camelcase + 3851:8 error Identifier 'manage_options' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/test/utils.js + 44:5 error Identifier 'is_previewable' is not in camel case camelcase + 45:5 error Identifier 'is_customizable' is not in camel case camelcase + 50:6 error Identifier 'default_post_format' is not in camel case camelcase + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 57:5 error Identifier 'default_post_format' is not in camel case camelcase + 58:5 error Identifier 'is_mapped_domain' is not in camel case camelcase + 59:5 error Identifier 'unmapped_url' is not in camel case camelcase + 60:5 error Identifier 'is_redirect' is not in camel case camelcase + 86:5 error Identifier 'is_previewable' is not in camel case camelcase + 87:5 error Identifier 'is_customizable' is not in camel case camelcase + 92:5 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/updates/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/updates/reducer.js + 32:1 error Expected indentation of 3 tabs but found 4 indent + 33:1 error Expected indentation of 4 tabs but found 5 indent + 34:1 error Expected indentation of 4 tabs but found 5 indent + 35:1 error Expected indentation of 3 tabs but found 4 indent + 36:1 error Expected indentation of 3 tabs but found 4 indent + 37:1 error Expected indentation of 2 tabs but found 3 indent + +/Users/seear/repos/wp-calypso/client/state/sites/updates/schema.js + 9:5 error Identifier 'jp_version' is not in camel case camelcase + 15:5 error Identifier 'wp_version' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/updates/test/actions.js + 107:1 error Line 107 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/updates/test/reducer.js + 268:1 error Line 268 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/sites/updates/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/utils.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 36:3 error Identifier 'is_customizable' is not in camel case camelcase + 37:3 error Identifier 'is_previewable' is not in camel case camelcase + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 46:22 error Identifier 'wpcom_url' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/vouchers/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/vouchers/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/vouchers/schema.js + 22:8 error Identifier 'assigned_by' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/vouchers/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/sites/vouchers/test/fixture/index.js + 10:2 error Identifier 'assigned_by' is not in camel case camelcase + 17:2 error Identifier 'assigned_by' is not in camel case camelcase + 52:2 error Identifier 'service_type' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/sites/vouchers/test/reducer.js + 53:1 error Line 53 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/stats/lists/constants.js + 15:2 error Identifier 'google_plus' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/stats/lists/selectors.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 45:1 error Line 45 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/stats/lists/test/actions.js + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + 105:1 error Line 105 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/stats/lists/test/selectors.js + 58:1 error Line 58 exceeds the maximum line length of 100 max-len + 81:1 error Line 81 exceeds the maximum line length of 100 max-len + 299:1 error Line 299 exceeds the maximum line length of 100 max-len + 307:1 error Line 307 exceeds the maximum line length of 100 max-len + 315:1 error Line 315 exceeds the maximum line length of 100 max-len + 601:13 error Identifier 'views_best_day' is not in camel case camelcase + 602:13 error Identifier 'views_best_day_total' is not in camel case camelcase + 666:16 error Identifier 'country_code' is not in camel case camelcase + 670:14 error Identifier 'other_views' is not in camel case camelcase + 671:14 error Identifier 'total_views' is not in camel case camelcase + 676:14 error Identifier 'flag_icon' is not in camel case camelcase + 677:1 error Line 677 exceeds the maximum line length of 100 max-len + 678:14 error Identifier 'flat_flag_icon' is not in camel case camelcase + 679:1 error Line 679 exceeds the maximum line length of 100 max-len + 680:14 error Identifier 'country_full' is not in camel case camelcase + 681:14 error Identifier 'map_region' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/stats/lists/test/utils.js + 30:3 error Identifier 'delta_fields' is not in camel case camelcase + 49:3 error Identifier 'total_orders' is not in camel case camelcase + 59:6 error Identifier 'percentage_change' is not in camel case camelcase + 60:6 error Identifier 'reference_period' is not in camel case camelcase + 71:6 error Identifier 'percentage_change' is not in camel case camelcase + 72:6 error Identifier 'reference_period' is not in camel case camelcase + 90:5 error Identifier 'delta_fields' is not in camel case camelcase + 298:1 error Line 298 exceeds the maximum line length of 100 max-len + 301:1 error Line 301 exceeds the maximum line length of 100 max-len + 338:1 error Line 338 exceeds the maximum line length of 100 max-len + 371:7 error Identifier 'views_best_day' is not in camel case camelcase + 372:7 error Identifier 'views_best_day_total' is not in camel case camelcase + 397:6 error Identifier 'total_email' is not in camel case camelcase + 398:6 error Identifier 'total_wpcom' is not in camel case camelcase + 405:8 error Identifier 'follow_data' is not in camel case camelcase + 406:8 error Identifier 'date_subscribed' is not in camel case camelcase + 412:6 error Identifier 'total_email' is not in camel case camelcase + 413:6 error Identifier 'total_wpcom' is not in camel case camelcase + 495:1 error Line 495 exceeds the maximum line length of 100 max-len + 496:8 error Identifier 'follow_data' is not in camel case camelcase + 532:1 error Line 532 exceeds the maximum line length of 100 max-len + 578:9 error Identifier 'total_views' is not in camel case camelcase + 619:1 error Line 619 exceeds the maximum line length of 100 max-len + 621:1 error Line 621 exceeds the maximum line length of 100 max-len + 626:9 error Identifier 'total_views' is not in camel case camelcase + 648:1 error Line 648 exceeds the maximum line length of 100 max-len + 673:8 error Identifier 'total_views' is not in camel case camelcase + 733:11 error Identifier 'country_code' is not in camel case camelcase + 737:9 error Identifier 'other_views' is not in camel case camelcase + 738:9 error Identifier 'total_views' is not in camel case camelcase + 743:9 error Identifier 'flag_icon' is not in camel case camelcase + 744:1 error Line 744 exceeds the maximum line length of 100 max-len + 745:9 error Identifier 'flat_flag_icon' is not in camel case camelcase + 746:1 error Line 746 exceeds the maximum line length of 100 max-len + 747:9 error Identifier 'country_full' is not in camel case camelcase + 748:9 error Identifier 'map_region' is not in camel case camelcase + 777:11 error Identifier 'country_code' is not in camel case camelcase + 781:9 error Identifier 'other_views' is not in camel case camelcase + 782:9 error Identifier 'total_views' is not in camel case camelcase + 787:9 error Identifier 'flag_icon' is not in camel case camelcase + 788:1 error Line 788 exceeds the maximum line length of 100 max-len + 789:9 error Identifier 'flat_flag_icon' is not in camel case camelcase + 790:1 error Line 790 exceeds the maximum line length of 100 max-len + 791:9 error Identifier 'country_full' is not in camel case camelcase + 792:9 error Identifier 'map_region' is not in camel case camelcase + 820:10 error Identifier 'country_code' is not in camel case camelcase + 824:8 error Identifier 'other_views' is not in camel case camelcase + 825:8 error Identifier 'total_views' is not in camel case camelcase + 829:9 error Identifier 'flag_icon' is not in camel case camelcase + 830:1 error Line 830 exceeds the maximum line length of 100 max-len + 831:9 error Identifier 'flat_flag_icon' is not in camel case camelcase + 832:1 error Line 832 exceeds the maximum line length of 100 max-len + 833:9 error Identifier 'country_full' is not in camel case camelcase + 834:9 error Identifier 'map_region' is not in camel case camelcase + 864:11 error Identifier 'country_code' is not in camel case camelcase + 868:9 error Identifier 'other_views' is not in camel case camelcase + 869:9 error Identifier 'total_views' is not in camel case camelcase + 874:9 error Identifier 'flag_icon' is not in camel case camelcase + 875:1 error Line 875 exceeds the maximum line length of 100 max-len + 876:9 error Identifier 'flat_flag_icon' is not in camel case camelcase + 877:1 error Line 877 exceeds the maximum line length of 100 max-len + 878:9 error Identifier 'country_full' is not in camel case camelcase + 879:9 error Identifier 'map_region' is not in camel case camelcase + 908:11 error Identifier 'country_code' is not in camel case camelcase + 912:9 error Identifier 'other_views' is not in camel case camelcase + 913:9 error Identifier 'total_views' is not in camel case camelcase + 918:9 error Identifier 'flag_icon' is not in camel case camelcase + 919:1 error Line 919 exceeds the maximum line length of 100 max-len + 920:1 error Line 920 exceeds the maximum line length of 100 max-len + 920:9 error Identifier 'flat_flag_icon' is not in camel case camelcase + 921:9 error Identifier 'country_full' is not in camel case camelcase + 922:9 error Identifier 'map_region' is not in camel case camelcase + 951:11 error Identifier 'country_code' is not in camel case camelcase + 955:11 error Identifier 'country_code' is not in camel case camelcase + 959:9 error Identifier 'other_views' is not in camel case camelcase + 960:9 error Identifier 'total_views' is not in camel case camelcase + 965:9 error Identifier 'flag_icon' is not in camel case camelcase + 966:1 error Line 966 exceeds the maximum line length of 100 max-len + 967:9 error Identifier 'flat_flag_icon' is not in camel case camelcase + 968:1 error Line 968 exceeds the maximum line length of 100 max-len + 969:9 error Identifier 'country_full' is not in camel case camelcase + 970:9 error Identifier 'map_region' is not in camel case camelcase + 1000:48 error Identifier 'highest_day_of_week' is not in camel case camelcase + 1007:6 error Identifier 'highest_hour' is not in camel case camelcase + 1008:6 error Identifier 'highest_day_percent' is not in camel case camelcase + 1009:6 error Identifier 'highest_day_of_week' is not in camel case camelcase + 1010:6 error Identifier 'highest_hour_percent' is not in camel case camelcase + 1011:6 error Identifier 'hourly_views' is not in camel case camelcase + 1054:1 error Line 1054 exceeds the maximum line length of 100 max-len + 1059:1 error Line 1059 exceeds the maximum line length of 100 max-len + 1094:11 error Identifier 'post_id' is not in camel case camelcase + 1097:1 error Line 1097 exceeds the maximum line length of 100 max-len + 1118:1 error Line 1118 exceeds the maximum line length of 100 max-len + 1143:1 error Line 1143 exceeds the maximum line length of 100 max-len + 1160:1 error Line 1160 exceeds the maximum line length of 100 max-len + 1161:1 error Line 1161 exceeds the maximum line length of 100 max-len + 1165:1 error Line 1165 exceeds the maximum line length of 100 max-len + 1167:1 error Line 1167 exceeds the maximum line length of 100 max-len + 1203:1 error Line 1203 exceeds the maximum line length of 100 max-len + 1390:1 error Line 1390 exceeds the maximum line length of 100 max-len + 1405:1 error Line 1405 exceeds the maximum line length of 100 max-len + 1431:1 error Line 1431 exceeds the maximum line length of 100 max-len + 1439:1 error Line 1439 exceeds the maximum line length of 100 max-len + 1456:1 error Line 1456 exceeds the maximum line length of 100 max-len + 1471:1 error Line 1471 exceeds the maximum line length of 100 max-len + 1497:1 error Line 1497 exceeds the maximum line length of 100 max-len + 1505:1 error Line 1505 exceeds the maximum line length of 100 max-len + 1542:1 error Line 1542 exceeds the maximum line length of 100 max-len + 1551:1 error Line 1551 exceeds the maximum line length of 100 max-len + 1554:1 error Line 1554 exceeds the maximum line length of 100 max-len + 1555:1 error Line 1555 exceeds the maximum line length of 100 max-len + 1576:1 error Line 1576 exceeds the maximum line length of 100 max-len + 1609:1 error Line 1609 exceeds the maximum line length of 100 max-len + 1630:1 error Line 1630 exceeds the maximum line length of 100 max-len + 1639:1 error Line 1639 exceeds the maximum line length of 100 max-len + 1642:1 error Line 1642 exceeds the maximum line length of 100 max-len + 1643:1 error Line 1643 exceeds the maximum line length of 100 max-len + 1664:1 error Line 1664 exceeds the maximum line length of 100 max-len + 1697:1 error Line 1697 exceeds the maximum line length of 100 max-len + 1729:9 error Identifier 'encrypted_search_terms' is not in camel case camelcase + 1730:9 error Identifier 'search_terms' is not in camel case camelcase + 1774:8 error Identifier 'encrypted_search_terms' is not in camel case camelcase + 1775:8 error Identifier 'search_terms' is not in camel case camelcase + 1933:11 error Identifier 'post_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/stats/lists/utils.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 146:1 error Line 146 exceeds the maximum line length of 100 max-len + 164:1 error Line 164 exceeds the maximum line length of 100 max-len + 219:1 error Line 219 exceeds the maximum line length of 100 max-len + 330:4 error Identifier 'highest_hour' is not in camel case camelcase + 331:4 error Identifier 'highest_day_percent' is not in camel case camelcase + 332:4 error Identifier 'highest_day_of_week' is not in camel case camelcase + 333:4 error Identifier 'highest_hour_percent' is not in camel case camelcase + 334:4 error Identifier 'hourly_views' is not in camel case camelcase + 338:19 error Identifier 'highest_day_of_week' is not in camel case camelcase + 353:17 error Identifier 'hourly_views' is not in camel case camelcase + 509:11 error Identifier 'total_wpcom' is not in camel case camelcase + 509:24 error Identifier 'total_email' is not in camel case camelcase + 531:12 error Identifier 'total_wpcom' is not in camel case camelcase + 531:12 error Identifier 'total_wpcom' is not in camel case camelcase + 531:25 error Identifier 'total_email' is not in camel case camelcase + 531:25 error Identifier 'total_email' is not in camel case camelcase + 941:1 error Line 941 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/stats/posts/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/stats/posts/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/stats/posts/test/selectors.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 61:1 error Line 61 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/stats/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/stored-cards/actions.js + 3:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/stored-cards/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/stored-cards/schema.js + 11:4 error Identifier 'card_type' is not in camel case camelcase + 12:4 error Identifier 'last_service' is not in camel case camelcase + 13:4 error Identifier 'last_used' is not in camel case camelcase + 15:4 error Identifier 'mp_ref' is not in camel case camelcase + 17:4 error Identifier 'payment_partner' is not in camel case camelcase + 19:4 error Identifier 'stored_details_id' is not in camel case camelcase + 20:4 error Identifier 'user_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/stored-cards/test/actions.js + 40:13 error Identifier 'stored_details_id' is not in camel case camelcase + 64:21 error Identifier 'stored_details_id' is not in camel case camelcase + 64:47 error Identifier 'stored_details_id' is not in camel case camelcase + 115:4 error Identifier 'stored_details_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/stored-cards/test/fixture/index.js + 4:3 error Identifier 'user_id' is not in camel case camelcase + 5:3 error Identifier 'stored_details_id' is not in camel case camelcase + 8:3 error Identifier 'card_type' is not in camel case camelcase + 9:3 error Identifier 'mp_ref' is not in camel case camelcase + 10:3 error Identifier 'payment_partner' is not in camel case camelcase + 16:3 error Identifier 'last_used' is not in camel case camelcase + 19:3 error Identifier 'user_id' is not in camel case camelcase + 20:3 error Identifier 'stored_details_id' is not in camel case camelcase + 23:3 error Identifier 'card_type' is not in camel case camelcase + 24:3 error Identifier 'mp_ref' is not in camel case camelcase + 25:3 error Identifier 'payment_partner' is not in camel case camelcase + 31:3 error Identifier 'last_used' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/stored-cards/test/reducer.js + 41:1 error Line 41 exceeds the maximum line length of 100 max-len + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + 120:1 error Line 120 exceeds the maximum line length of 100 max-len + 183:6 error Identifier 'card_type' is not in camel case camelcase + 184:6 error Identifier 'payment_partner' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/stored-cards/test/selectors.js + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/support/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 35:1 error Expected JSDoc for 'username' but found 'userName' valid-jsdoc + 47:1 error Expected JSDoc for 'username' but found 'userName' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/support/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/terms/actions.js + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + 96:1 error Line 96 exceeds the maximum line length of 100 max-len + 114:46 error Identifier 'default_category' is not in camel case camelcase + 156:1 error Line 156 exceeds the maximum line length of 100 max-len + 179:9 error Identifier 'post_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/terms/constants.js + 4:2 error Identifier 'http_envelope' is not in camel case camelcase + 10:2 error Identifier 'order_by' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/terms/test/actions.js + 42:3 error Identifier 'post_count' is not in camel case camelcase + 50:3 error Identifier 'post_count' is not in camel case camelcase + 272:1 error Line 272 exceeds the maximum line length of 100 max-len + 285:1 error Line 285 exceeds the maximum line length of 100 max-len + 290:7 error Identifier 'site_ID' is not in camel case camelcase + 291:7 error Identifier 'global_ID' is not in camel case camelcase + 294:1 error Line 294 exceeds the maximum line length of 100 max-len + 310:8 error Identifier 'default_category' is not in camel case camelcase + 356:1 error Line 356 exceeds the maximum line length of 100 max-len + 364:7 error Identifier 'default_category' is not in camel case camelcase + 370:1 error Line 370 exceeds the maximum line length of 100 max-len + 376:8 error Identifier 'default_category' is not in camel case camelcase + 403:7 error Identifier 'default_category' is not in camel case camelcase + 414:1 error Line 414 exceeds the maximum line length of 100 max-len + 417:1 error Line 417 exceeds the maximum line length of 100 max-len + 427:7 error Identifier 'site_ID' is not in camel case camelcase + 428:7 error Identifier 'global_ID' is not in camel case camelcase + 451:1 error Line 451 exceeds the maximum line length of 100 max-len + 506:21 error Identifier 'default_category' is not in camel case camelcase + 514:1 error Line 514 exceeds the maximum line length of 100 max-len + 514:67 error Identifier 'post_count' is not in camel case camelcase + 515:1 error Line 515 exceeds the maximum line length of 100 max-len + 515:63 error Identifier 'post_count' is not in camel case camelcase + 525:1 error Line 525 exceeds the maximum line length of 100 max-len + 530:1 error Line 530 exceeds the maximum line length of 100 max-len + 530:69 error Identifier 'post_count' is not in camel case camelcase + 543:1 error Line 543 exceeds the maximum line length of 100 max-len + 554:21 error Identifier 'default_category' is not in camel case camelcase + 562:1 error Line 562 exceeds the maximum line length of 100 max-len + 562:67 error Identifier 'post_count' is not in camel case camelcase + 573:1 error Line 573 exceeds the maximum line length of 100 max-len + 578:1 error Line 578 exceeds the maximum line length of 100 max-len + 578:69 error Identifier 'post_count' is not in camel case camelcase + 592:1 error Line 592 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/terms/test/reducer.js + 34:3 error Identifier 'post_count' is not in camel case camelcase + 42:3 error Identifier 'post_count' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/terms/test/selectors.js + 433:1 error Line 433 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/test/index.js + 36:29 error Identifier 'display_name' is not in camel case camelcase + 42:1 error Line 42 exceeds the maximum line length of 100 max-len + 53:13 error Unexpected console statement no-console + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 57:13 error Unexpected console statement no-console + +/Users/seear/repos/wp-calypso/client/state/test/initial-state.js + 19:1 error 'test/helpers/use-sinon' import is duplicated no-duplicate-imports + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + 184:1 error Line 184 exceeds the maximum line length of 100 max-len + 240:1 error Line 240 exceeds the maximum line length of 100 max-len + 289:1 error Line 289 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/test/utils.js + 202:1 error Line 202 exceeds the maximum line length of 100 max-len + 203:1 error Line 203 exceeds the maximum line length of 100 max-len + 206:1 error Line 206 exceeds the maximum line length of 100 max-len + 224:1 error Line 224 exceeds the maximum line length of 100 max-len + 228:1 error Line 228 exceeds the maximum line length of 100 max-len + 324:58 error Unnecessarily quoted property '0' found quote-props + 329:21 error Unnecessarily quoted property '10' found quote-props + 329:60 error Unnecessarily quoted property '10' found quote-props + 330:62 error Unnecessarily quoted property '10' found quote-props + 331:60 error Unnecessarily quoted property '10' found quote-props + 332:21 error Unnecessarily quoted property '10' found quote-props + 332:58 error Unnecessarily quoted property '10' found quote-props + 596:1 error Line 596 exceeds the maximum line length of 100 max-len + 613:1 error Line 613 exceeds the maximum line length of 100 max-len + 646:1 error Line 646 exceeds the maximum line length of 100 max-len + 652:1 error Line 652 exceeds the maximum line length of 100 max-len + 667:1 error Line 667 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/themes/actions.js + 122:1 error Line 122 exceeds the maximum line length of 100 max-len + 188:12 error Identifier 'search_taxonomies' is not in camel case camelcase + 189:12 error Identifier 'search_term' is not in camel case camelcase + 189:26 error Identifier 'search_taxonomies' is not in camel case camelcase + 191:7 error Identifier 'search_term' is not in camel case camelcase + 191:20 error Identifier 'search_term' is not in camel case camelcase + 192:7 error Identifier 'search_taxonomies' is not in camel case camelcase + 192:7 error Identifier 'search_taxonomies' is not in camel case camelcase + 194:7 error Identifier 'response_time_in_ms' is not in camel case camelcase + 195:7 error Identifier 'result_count' is not in camel case camelcase + 196:7 error Identifier 'results_first_page' is not in camel case camelcase + 242:1 error Line 242 exceeds the maximum line length of 100 max-len + 286:1 error Line 286 exceeds the maximum line length of 100 max-len + 325:1 error Line 325 exceeds the maximum line length of 100 max-len + 411:1 error Line 411 exceeds the maximum line length of 100 max-len + 424:9 error Identifier 'search_taxonomies' is not in camel case camelcase + 425:9 error Identifier 'search_term' is not in camel case camelcase + 425:23 error Identifier 'search_taxonomies' is not in camel case camelcase + 428:4 error Identifier 'previous_theme' is not in camel case camelcase + 431:4 error Identifier 'search_term' is not in camel case camelcase + 431:17 error Identifier 'search_term' is not in camel case camelcase + 432:4 error Identifier 'search_taxonomies' is not in camel case camelcase + 432:4 error Identifier 'search_taxonomies' is not in camel case camelcase + 441:1 error Line 441 exceeds the maximum line length of 100 max-len + 562:1 error Line 562 exceeds the maximum line length of 100 max-len + 654:1 error Line 654 exceeds the maximum line length of 100 max-len + 668:15 error Identifier 'transfer_id' is not in camel case camelcase + 669:12 error Identifier 'transfer_id' is not in camel case camelcase + 677:18 error Identifier 'transfer_id' is not in camel case camelcase + 681:1 error Line 681 exceeds the maximum line length of 100 max-len + 726:1 error Line 726 exceeds the maximum line length of 100 max-len + 758:33 error Identifier 'uploaded_theme_slug' is not in camel case camelcase + 759:1 error Line 759 exceeds the maximum line length of 100 max-len + 762:26 error Identifier 'uploaded_theme_slug' is not in camel case camelcase + 765:9 error Identifier 'transfer_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/themes/reducer.js + 327:1 error Line 327 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/themes/schema.js + 11:3 error Identifier 'demo_uri' is not in camel case camelcase + 12:3 error Identifier 'author_uri' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/themes/selectors.js + 24:1 error 'state/sites/selectors' import is duplicated no-duplicate-imports + 518:1 error Line 518 exceeds the maximum line length of 100 max-len + 519:1 error Line 519 exceeds the maximum line length of 100 max-len + 520:1 error Line 520 exceeds the maximum line length of 100 max-len + 522:1 error Line 522 exceeds the maximum line length of 100 max-len + 616:1 error Line 616 exceeds the maximum line length of 100 max-len + 623:1 error Line 623 exceeds the maximum line length of 100 max-len + 701:1 error Line 701 exceeds the maximum line length of 100 max-len + 736:1 error Line 736 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/themes/test/actions.js + 113:18 error Identifier 'jetpack_version' is not in camel case camelcase + 232:1 error Line 232 exceeds the maximum line length of 100 max-len + 357:1 error Line 357 exceeds the maximum line length of 100 max-len + 362:1 error Line 362 exceeds the maximum line length of 100 max-len + 410:10 error Identifier 'previous_theme' is not in camel case camelcase + 412:10 error Identifier 'search_taxonomies' is not in camel case camelcase + 413:10 error Identifier 'search_term' is not in camel case camelcase + 459:4 error Identifier 'previous_theme' is not in camel case camelcase + 462:4 error Identifier 'search_term' is not in camel case camelcase + 547:1 error Line 547 exceeds the maximum line length of 100 max-len + 582:1 error Line 582 exceeds the maximum line length of 100 max-len + 603:1 error Line 603 exceeds the maximum line length of 100 max-len + 629:4 error Identifier 'download_url' is not in camel case camelcase + 630:4 error Identifier 'trending_rank' is not in camel case camelcase + 631:4 error Identifier 'popularity_rank' is not in camel case camelcase + 632:4 error Identifier 'launch_date' is not in camel case camelcase + 653:4 error Identifier 'preview_url' is not in camel case camelcase + 721:1 error Line 721 exceeds the maximum line length of 100 max-len + 721:61 error Identifier 'uploaded_theme_slug' is not in camel case camelcase + 729:1 error Line 729 exceeds the maximum line length of 100 max-len + 729:61 error Identifier 'uploaded_theme_slug' is not in camel case camelcase + 788:1 error Line 788 exceeds the maximum line length of 100 max-len + 799:55 error Identifier 'transfer_id' is not in camel case camelcase + 833:1 error Line 833 exceeds the maximum line length of 100 max-len + 850:1 error Line 850 exceeds the maximum line length of 100 max-len + 853:4 error Identifier 'theme_uri' is not in camel case camelcase + 855:1 error Line 855 exceeds the maximum line length of 100 max-len + 856:1 error Line 856 exceeds the maximum line length of 100 max-len + 858:4 error Identifier 'author_uri' is not in camel case camelcase + 903:1 error Line 903 exceeds the maximum line length of 100 max-len + 913:1 error Line 913 exceeds the maximum line length of 100 max-len + 924:1 error Line 924 exceeds the maximum line length of 100 max-len + 1008:1 error Line 1008 exceeds the maximum line length of 100 max-len + 1043:1 error Line 1043 exceeds the maximum line length of 100 max-len + 1049:1 error Line 1049 exceeds the maximum line length of 100 max-len + 1064:1 error Line 1064 exceeds the maximum line length of 100 max-len + 1070:1 error Line 1070 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/themes/test/reducer.js + 55:2 error Identifier 'demo_uri' is not in camel case camelcase + 56:2 error Identifier 'author_uri' is not in camel case camelcase + 66:2 error Identifier 'demo_uri' is not in camel case camelcase + 67:2 error Identifier 'author_uri' is not in camel case camelcase + 483:1 error Line 483 exceeds the maximum line length of 100 max-len + 504:1 error Line 504 exceeds the maximum line length of 100 max-len + 574:1 error Line 574 exceeds the maximum line length of 100 max-len + 829:1 error Line 829 exceeds the maximum line length of 100 max-len + 850:1 error Line 850 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/themes/test/selectors.js + 56:2 error Identifier 'demo_uri' is not in camel case camelcase + 57:2 error Identifier 'author_uri' is not in camel case camelcase + 67:2 error Identifier 'demo_uri' is not in camel case camelcase + 68:2 error Identifier 'author_uri' is not in camel case camelcase + 78:2 error Identifier 'demo_uri' is not in camel case camelcase + 79:2 error Identifier 'author_uri' is not in camel case camelcase + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + 153:5 error Identifier 'demo_uri' is not in camel case camelcase + 156:6 error Identifier 'theme_feature' is not in camel case camelcase + 178:1 error Line 178 exceeds the maximum line length of 100 max-len + 204:1 error Line 204 exceeds the maximum line length of 100 max-len + 348:1 error Line 348 exceeds the maximum line length of 100 max-len + 391:1 error Line 391 exceeds the maximum line length of 100 max-len + 451:1 error Line 451 exceeds the maximum line length of 100 max-len + 581:1 error Line 581 exceeds the maximum line length of 100 max-len + 994:12 error Identifier 'admin_url' is not in camel case camelcase + 995:12 error Identifier 'jetpack_version' is not in camel case camelcase + 1022:13 error Identifier 'admin_url' is not in camel case camelcase + 1023:13 error Identifier 'jetpack_version' is not in camel case camelcase + 1024:13 error Identifier 'active_modules' is not in camel case camelcase + 1050:13 error Identifier 'admin_url' is not in camel case camelcase + 1051:13 error Identifier 'jetpack_version' is not in camel case camelcase + 1179:11 error Identifier 'admin_url' is not in camel case camelcase + 1253:10 error Identifier 'admin_url' is not in camel case camelcase + 1362:1 error Line 1362 exceeds the maximum line length of 100 max-len + 1365:1 error Line 1365 exceeds the maximum line length of 100 max-len + 1403:10 error Identifier 'admin_url' is not in camel case camelcase + 1430:1 error Line 1430 exceeds the maximum line length of 100 max-len + 1431:1 error Line 1431 exceeds the maximum line length of 100 max-len + 1433:1 error Line 1433 exceeds the maximum line length of 100 max-len + 1440:1 error Line 1440 exceeds the maximum line length of 100 max-len + 1457:10 error Identifier 'admin_url' is not in camel case camelcase + 1484:1 error Line 1484 exceeds the maximum line length of 100 max-len + 1485:1 error Line 1485 exceeds the maximum line length of 100 max-len + 1487:1 error Line 1487 exceeds the maximum line length of 100 max-len + 1494:1 error Line 1494 exceeds the maximum line length of 100 max-len + 1519:1 error Line 1519 exceeds the maximum line length of 100 max-len + 1536:1 error Line 1536 exceeds the maximum line length of 100 max-len + 1573:1 error Line 1573 exceeds the maximum line length of 100 max-len + 1578:5 error Identifier 'demo_uri' is not in camel case camelcase + 1581:6 error Identifier 'theme_feature' is not in camel case camelcase + 1648:1 error Line 1648 exceeds the maximum line length of 100 max-len + 1671:1 error Line 1671 exceeds the maximum line length of 100 max-len + 1698:1 error Line 1698 exceeds the maximum line length of 100 max-len + 1705:6 error Identifier 'demo_uri' is not in camel case camelcase + 1708:7 error Identifier 'theme_feature' is not in camel case camelcase + 1771:1 error Line 1771 exceeds the maximum line length of 100 max-len + 1869:1 error Line 1869 exceeds the maximum line length of 100 max-len + 2029:1 error Line 2029 exceeds the maximum line length of 100 max-len + 2077:5 error Identifier 'demo_uri' is not in camel case camelcase + 2080:6 error Identifier 'theme_feature' is not in camel case camelcase + 2200:8 error Identifier 'blog_id' is not in camel case camelcase + 2202:8 error Identifier 'product_slug' is not in camel case camelcase + 2218:9 error Identifier 'blog_id' is not in camel case camelcase + 2220:9 error Identifier 'product_slug' is not in camel case camelcase + 2231:1 error Line 2231 exceeds the maximum line length of 100 max-len + 2238:9 error Identifier 'blog_id' is not in camel case camelcase + 2240:9 error Identifier 'product_slug' is not in camel case camelcase + 2259:9 error Identifier 'blog_id' is not in camel case camelcase + 2261:9 error Identifier 'product_slug' is not in camel case camelcase + 2284:8 error Identifier 'blog_id' is not in camel case camelcase + 2286:8 error Identifier 'product_slug' is not in camel case camelcase + 2305:9 error Identifier 'blog_id' is not in camel case camelcase + 2307:9 error Identifier 'product_slug' is not in camel case camelcase + 2318:1 error Line 2318 exceeds the maximum line length of 100 max-len + 2344:9 error Identifier 'blog_id' is not in camel case camelcase + 2346:9 error Identifier 'product_slug' is not in camel case camelcase + 2358:1 error Line 2358 exceeds the maximum line length of 100 max-len + 2394:1 error Line 2394 exceeds the maximum line length of 100 max-len + 2494:1 error Line 2494 exceeds the maximum line length of 100 max-len + 2504:10 error Identifier 'jetpack_version' is not in camel case camelcase + 2523:1 error Line 2523 exceeds the maximum line length of 100 max-len + 2533:10 error Identifier 'jetpack_version' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/themes/test/utils.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 76:6 error Identifier 'theme_feature' is not in camel case camelcase + 93:1 error Line 93 exceeds the maximum line length of 100 max-len + 93:5 error Identifier 'description_long' is not in camel case camelcase + 94:5 error Identifier 'support_documentation' is not in camel case camelcase + 99:5 error Identifier 'demo_uri' is not in camel case camelcase + 100:5 error Identifier 'author_uri' is not in camel case camelcase + 107:1 error Line 107 exceeds the maximum line length of 100 max-len + 113:5 error Identifier 'demo_uri' is not in camel case camelcase + 114:5 error Identifier 'author_uri' is not in camel case camelcase + 130:6 error Identifier 'user_nicename' is not in camel case camelcase + 131:6 error Identifier 'display_name' is not in camel case camelcase + 133:5 error Identifier 'screenshot_url' is not in camel case camelcase + 134:5 error Identifier 'preview_url' is not in camel case camelcase + 135:5 error Identifier 'download_link' is not in camel case camelcase + 138:1 error Line 138 exceeds the maximum line length of 100 max-len + 150:5 error Identifier 'demo_uri' is not in camel case camelcase + 152:1 error Line 152 exceeds the maximum line length of 100 max-len + 154:6 error Identifier 'theme_feature' is not in camel case camelcase + 174:1 error Line 174 exceeds the maximum line length of 100 max-len + 273:1 error Line 273 exceeds the maximum line length of 100 max-len + 275:1 error Line 275 exceeds the maximum line length of 100 max-len + 279:5 error Identifier 'theme_feature' is not in camel case camelcase + 289:5 error Identifier 'theme_color' is not in camel case camelcase + 293:7 error Identifier 'term_id' is not in camel case camelcase + 298:7 error Identifier 'term_id' is not in camel case camelcase + 303:7 error Identifier 'term_id' is not in camel case camelcase + 307:4 error Identifier 'demo_uri' is not in camel case camelcase + 309:1 error Line 309 exceeds the maximum line length of 100 max-len + 310:1 error Line 310 exceeds the maximum line length of 100 max-len + 313:1 error Line 313 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/themes/themes-ui/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/themes/themes-ui/test/selectors.js + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/themes/upload-theme/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/themes/utils.js + 55:4 error Identifier 'theme_feature' is not in camel case camelcase + 68:3 error Identifier 'description_long' is not in camel case camelcase + 69:3 error Identifier 'support_documentation' is not in camel case camelcase + 70:3 error Identifier 'download_uri' is not in camel case camelcase + 85:3 error Identifier 'preview_url' is not in camel case camelcase + 86:3 error Identifier 'screenshot_url' is not in camel case camelcase + 87:3 error Identifier 'download_link' is not in camel case camelcase + 111:4 error Identifier 'theme_feature' is not in camel case camelcase + 117:1 error Line 117 exceeds the maximum line length of 100 max-len + 241:1 error Line 241 exceeds the maximum line length of 100 max-len + 252:1 error Line 252 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/timezones/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/timezones/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/drop-zone/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/drop-zone/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/actions.js + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/editor/contact-form/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/contact-form/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/contact-form/reducer.js + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/editor/contact-form/test/reducer.js + 29:1 error Line 29 exceeds the maximum line length of 100 max-len + 98:1 error Line 98 exceeds the maximum line length of 100 max-len + 162:1 error Line 162 exceeds the maximum line length of 100 max-len + 224:1 error Line 224 exceeds the maximum line length of 100 max-len + 235:1 error Line 235 exceeds the maximum line length of 100 max-len + 242:1 error Line 242 exceeds the maximum line length of 100 max-len + 258:1 error Line 258 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/editor/image-editor/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/image-editor/constants.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/image-editor/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/image-editor/test/actions.js + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/editor/image-editor/test/reducer.js + 274:1 error Line 274 exceeds the maximum line length of 100 max-len + 295:1 error Line 295 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/editor/last-draft/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/last-draft/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/last-draft/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/last-draft/test/selectors.js + 47:10 error Identifier 'site_ID' is not in camel case camelcase + 48:10 error Identifier 'global_ID' is not in camel case camelcase + 74:5 error Identifier 'site_ID' is not in camel case camelcase + 75:5 error Identifier 'global_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/ui/editor/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/selectors.js + 124:1 error Line 124 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/editor/test/reducer.js + 56:1 error Line 56 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/editor/test/selectors.js + 192:11 error Identifier 'site_ID' is not in camel case camelcase + 193:11 error Identifier 'global_ID' is not in camel case camelcase + 226:11 error Identifier 'site_ID' is not in camel case camelcase + 227:11 error Identifier 'global_ID' is not in camel case camelcase + 260:11 error Identifier 'site_ID' is not in camel case camelcase + 261:11 error Identifier 'global_ID' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/ui/editor/video-editor/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/video-editor/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/editor/video-editor/test/actions.js + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/first-view/actions.js + 34:42 error Strings must use singlequote quotes + 36:4 error Identifier 'show_again' is not in camel case camelcase + 37:4 error Identifier 'time_spent' is not in camel case camelcase + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/first-view/selectors.js + 79:1 error Line 79 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/first-view/test/selectors.js + 26:1 error Line 26 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + 59:1 error Line 59 exceeds the maximum line length of 100 max-len + 66:1 error Line 66 exceeds the maximum line length of 100 max-len + 72:1 error Line 72 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 83:1 error Line 83 exceeds the maximum line length of 100 max-len + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + 163:1 error Line 163 exceeds the maximum line length of 100 max-len + 194:1 error Line 194 exceeds the maximum line length of 100 max-len + 301:1 error Line 301 exceeds the maximum line length of 100 max-len + 337:1 error Line 337 exceeds the maximum line length of 100 max-len + 408:1 error Line 408 exceeds the maximum line length of 100 max-len + 448:1 error Line 448 exceeds the maximum line length of 100 max-len + 469:1 error Line 469 exceeds the maximum line length of 100 max-len + 490:1 error Line 490 exceeds the maximum line length of 100 max-len + 511:1 error Line 511 exceeds the maximum line length of 100 max-len + 532:1 error Line 532 exceeds the maximum line length of 100 max-len + 553:1 error Line 553 exceeds the maximum line length of 100 max-len + 574:1 error Line 574 exceeds the maximum line length of 100 max-len + 595:1 error Line 595 exceeds the maximum line length of 100 max-len + 616:1 error Line 616 exceeds the maximum line length of 100 max-len + 637:1 error Line 637 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/guided-tours/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/guided-tours/selectors/index.js + 64:1 error Line 64 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/guided-tours/test/contexts.js + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + 97:1 error Line 97 exceeds the maximum line length of 100 max-len + 130:1 error Line 130 exceeds the maximum line length of 100 max-len + 142:1 error Line 142 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/guided-tours/test/selectors.js + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/language/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/layout-focus/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/layout-focus/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/layout-focus/test/actions.js + 27:1 error Line 27 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/layout-focus/test/reducer.js + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/media-modal/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/media-modal/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/nps-survey-notice/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/nps-survey-notice/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/oauth2-clients/test/reducer.js + 31:6 error Identifier 'client_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/ui/olark/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/olark/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/olark/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/olark/test/actions.js + 12:1 error '../actions' import is duplicated no-duplicate-imports + 22:1 error 'test/helpers/use-sinon' import is duplicated no-duplicate-imports + +/Users/seear/repos/wp-calypso/client/state/ui/post-type-list/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/post-type-list/selectors.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'state' valid-jsdoc + 1:1 error Missing JSDoc for parameter 'postGlobalId' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/ui/post-type-list/test/reducer.js + 52:1 error Line 52 exceeds the maximum line length of 100 max-len + 65:1 error Line 65 exceeds the maximum line length of 100 max-len + 78:1 error Line 78 exceeds the maximum line length of 100 max-len + 92:1 error Line 92 exceeds the maximum line length of 100 max-len + 106:1 error Line 106 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/preview/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/preview/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/preview/selectors.js + 1:1 error Missing JSDoc @returns for function valid-jsdoc + 1:1 error Missing JSDoc for parameter 'state' valid-jsdoc + +/Users/seear/repos/wp-calypso/client/state/ui/reader/card-expansions/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/reader/card-expansions/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/reader/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/reader/sidebar/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/reader/sidebar/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/ui/selectors.js + 138:1 error Line 138 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/test/selectors.js + 62:5 error Identifier 'is_customizable' is not in camel case camelcase + 63:5 error Identifier 'is_previewable' is not in camel case camelcase + 65:6 error Identifier 'default_post_format' is not in camel case camelcase + 302:1 error Line 302 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/ui/theme-setup/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/user-devices/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/user-devices/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/user-settings/actions.js + 57:22 error Identifier 'user_email_change_pending' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/user-settings/test/actions.js + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/users/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/users/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/users/suggestions/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + 47:16 error Identifier 'site_id' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/users/suggestions/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/users/suggestions/schema.js + 13:6 error Identifier 'display_name' is not in camel case camelcase + 14:6 error Identifier 'image_URL' is not in camel case camelcase + 19:6 error Identifier 'user_login' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/users/suggestions/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/users/suggestions/test/reducer.js + 30:14 error Identifier 'user_login' is not in camel case camelcase + 33:5 error Identifier 'user_login' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/users/suggestions/test/selectors.js + 27:30 error Identifier 'user_login' is not in camel case camelcase + 28:31 error Identifier 'user_login' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/client/state/utils.js + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + 104:4 error Strings must use singlequote quotes + 110:1 error Line 110 exceeds the maximum line length of 100 max-len + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 116:4 error Strings must use singlequote quotes + 319:1 error Line 319 exceeds the maximum line length of 100 max-len + 398:1 error Line 398 exceeds the maximum line length of 100 max-len + 399:1 error Line 399 exceeds the maximum line length of 100 max-len + 400:1 error Line 400 exceeds the maximum line length of 100 max-len + 401:1 error Line 401 exceeds the maximum line length of 100 max-len + 402:1 error Line 402 exceeds the maximum line length of 100 max-len + 463:1 error Line 463 exceeds the maximum line length of 100 max-len + 479:1 error Line 479 exceeds the maximum line length of 100 max-len + 480:1 error Line 480 exceeds the maximum line length of 100 max-len + 482:1 error Line 482 exceeds the maximum line length of 100 max-len + 484:1 error Line 484 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/wordads/approve/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/wordads/approve/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/wordads/approve/test/actions.js + 86:1 error Line 86 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/wordads/approve/test/selectors.js + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/client/state/wordads/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/wordads/status/actions.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/wordads/status/reducer.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/state/wordads/status/schema.js + 14:15 error Unquoted reserved word 'enum' used as key quote-props + +/Users/seear/repos/wp-calypso/client/state/wordads/status/selectors.js + 7:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/client/wordpress-com.js + 250:1 error Line 250 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/index.js + 6:1 error Unexpected var, use let or const instead no-var + 13:1 error Unexpected var, use let or const instead no-var + 16:1 error Unexpected var, use let or const instead no-var + 32:1 error Line 32 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/api/index.js + 4:1 error Unexpected var, use let or const instead no-var + 9:1 error Unexpected var, use let or const instead no-var + 14:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/server/api/integration/index.js + 88:1 error Line 88 exceeds the maximum line length of 100 max-len + 88:4 error Identifier 'error_description' is not in camel case camelcase + 101:22 error Identifier 'access_token' is not in camel case camelcase + 108:63 error Identifier 'auth_code' is not in camel case camelcase + 115:4 error Identifier 'error_description' is not in camel case camelcase + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/api/oauth.js + 4:1 error Unexpected var, use let or const instead no-var + 10:1 error Unexpected var, use let or const instead no-var + 14:3 error Identifier 'client_id' is not in camel case camelcase + 15:3 error Identifier 'client_secret' is not in camel case camelcase + 16:3 error Identifier 'wpcom_supports_2fa' is not in camel case camelcase + 17:3 error Identifier 'grant_type' is not in camel case camelcase + 18:3 error Missing semicolon semi + 23:1 error Line 23 exceeds the maximum line length of 100 max-len + 27:2 error Unexpected var, use let or const instead no-var + 34:8 error Identifier 'wpcom_otp' is not in camel case camelcase + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 51:40 error Identifier 'error_description' is not in camel case camelcase + 54:3 error Missing semicolon semi + 66:3 error Missing semicolon semi + 79:2 error Unexpected var, use let or const instead no-var + 82:3 error Identifier 'wpcom_resend_otp' is not in camel case camelcase + 89:29 error Missing semicolon semi + 91:2 error Unnecessary semicolon no-extra-semi + 99:2 error Missing semicolon semi + +/Users/seear/repos/wp-calypso/server/boot/index.js + 46:5 error Unexpected console statement no-console + 50:19 error Identifier 'wordpress_logged_in' is not in camel case camelcase + 55:1 error Line 55 exceeds the maximum line length of 100 max-len + 55:5 error Unexpected console statement no-console + 69:1 error Line 69 exceeds the maximum line length of 100 max-len + 90:1 error Line 90 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/bundler/babel/babel-loader-cache-identifier/index.js + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + 28:1 error Line 28 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/bundler/babel/babel-plugin-transform-wpcalypso-async/index.js + 11:1 error Line 11 exceeds the maximum line length of 100 max-len + 100:1 error Line 100 exceeds the maximum line length of 100 max-len + 102:1 error Line 102 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/bundler/babel/babel-plugin-transform-wpcalypso-async/test/index.js + 38:1 error Line 38 exceeds the maximum line length of 100 max-len + 39:1 error Line 39 exceeds the maximum line length of 100 max-len + 40:1 error Line 40 exceeds the maximum line length of 100 max-len + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 50:1 error Line 50 exceeds the maximum line length of 100 max-len + 51:1 error Line 51 exceeds the maximum line length of 100 max-len + 75:1 error Line 75 exceeds the maximum line length of 100 max-len + 76:1 error Line 76 exceeds the maximum line length of 100 max-len + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + 85:1 error Line 85 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/bundler/css-hot-reload.js + 9:20 error There must be a space inside this paren space-in-parens + 9:31 error There must be a space inside this paren space-in-parens + 10:19 error There must be a space inside this paren space-in-parens + 10:30 error There must be a space inside this paren space-in-parens + 12:1 error Missing JSDoc for parameter 'io' valid-jsdoc + 15:22 error Block must not be padded by blank lines padded-blocks + 24:2 error Unexpected var, use let or const instead no-var + 65:2 error Missing JSDoc for parameter 'code' valid-jsdoc + 69:3 error Unexpected var, use let or const instead no-var + 99:2 error Missing JSDoc @returns for function valid-jsdoc + 104:3 error Unexpected var, use let or const instead no-var + 105:3 error Expected space(s) after "for" keyword-spacing + 120:4 error Unexpected var, use let or const instead no-var + 127:2 error Unexpected var, use let or const instead no-var + 136:38 error 'path' is already declared in the upper scope no-shadow + 142:1 error Block must not be padded by blank lines padded-blocks + +/Users/seear/repos/wp-calypso/server/bundler/extensions-loader.js + 11:1 error Line 11 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/bundler/hot-reloader.js + 6:1 error Unexpected var, use let or const instead no-var + 7:1 error Unexpected var, use let or const instead no-var + 8:1 error Unexpected var, use let or const instead no-var + 10:1 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/server/bundler/index.js + 44:1 error Line 44 exceeds the maximum line length of 100 max-len + 44:6 error Unexpected console statement no-console + 46:6 error Unexpected console statement no-console + 57:1 error Line 57 exceeds the maximum line length of 100 max-len + 57:3 error Unexpected console statement no-console + 67:1 error Line 67 exceeds the maximum line length of 100 max-len + 68:1 error Line 68 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/bundler/loader.js + 1:1 error Unexpected var, use let or const instead no-var + 5:2 error Unexpected var, use let or const instead no-var + 14:1 error Line 14 exceeds the maximum line length of 100 max-len + 73:2 error Unexpected var, use let or const instead no-var + 83:2 error Unexpected var, use let or const instead no-var + 101:1 error Line 101 exceeds the maximum line length of 100 max-len + 141:2 error Unexpected var, use let or const instead no-var + 164:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/server/config/parser.js + 12:2 error Unexpected var, use let or const instead no-var + 25:2 error Unexpected var, use let or const instead no-var + 57:1 error Trailing spaces not allowed no-trailing-spaces + 59:2 error Missing semicolon semi + +/Users/seear/repos/wp-calypso/server/config/test/__mocks__/fs.js + 27:4 error Identifier 'shared_only' is not in camel case camelcase + 28:4 error Identifier 'myenv_override' is not in camel case camelcase + 37:4 error Identifier 'myenv_only' is not in camel case camelcase + 38:4 error Identifier 'myenv_override' is not in camel case camelcase + 39:4 error Identifier 'myenvlocal_override' is not in camel case camelcase + 42:4 error Identifier 'myenvlocal_only' is not in camel case camelcase + 43:4 error Identifier 'myenvlocal_override' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/server/config/validate-config-keys.js + 17:1 error Line 17 exceeds the maximum line length of 100 max-len + 35:1 error Line 35 exceeds the maximum line length of 100 max-len + 52:4 error Unexpected console statement no-console + 57:5 error Strings must use singlequote quotes + +/Users/seear/repos/wp-calypso/server/devdocs/index.js + 115:1 error Line 115 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/isomorphic-routing/index.js + 18:1 error Line 18 exceeds the maximum line length of 100 max-len + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 20:1 error Line 20 exceeds the maximum line length of 100 max-len + 82:1 error Line 82 exceeds the maximum line length of 100 max-len + 84:1 error Line 84 exceeds the maximum line length of 100 max-len + 104:1 error Line 104 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/isomorphic-routing/loader.js + 2:2 error Unexpected var, use let or const instead no-var + 2:23 error Missing semicolon semi + 5:1 error Line 5 exceeds the maximum line length of 100 max-len + 16:1 error Expected indentation of 2 tabs but found 5 indent + 26:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/server/lib/analytics/index.js + 41:5 error Unexpected console statement no-console + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 61:5 error Identifier '_via_ip' is not in camel case camelcase + 62:5 error Identifier '_via_ua' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/server/pages/index.js + 119:1 error Line 119 exceeds the maximum line length of 100 max-len + 158:1 error Line 158 exceeds the maximum line length of 100 max-len + 193:1 error Line 193 exceeds the maximum line length of 100 max-len + 291:1 error Line 291 exceeds the maximum line length of 100 max-len + 305:6 error Unexpected console statement no-console + 340:1 error Line 340 exceeds the maximum line length of 100 max-len + 346:1 error Line 346 exceeds the maximum line length of 100 max-len + 435:1 error Line 435 exceeds the maximum line length of 100 max-len + 444:1 error Line 444 exceeds the maximum line length of 100 max-len + 455:1 error Line 455 exceeds the maximum line length of 100 max-len + 512:1 error Line 512 exceeds the maximum line length of 100 max-len + 533:1 error Line 533 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/pages/test/index.js + 30:1 error Line 30 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/server/render/index.js + 36:1 error Line 36 exceeds the maximum line length of 100 max-len + 143:4 error Unexpected console statement no-console + +/Users/seear/repos/wp-calypso/server/sanitize/index.js + 13:2 error Unexpected var, use let or const instead no-var + 46:2 error Unexpected var, use let or const instead no-var + 47:2 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/server/user-bootstrap/index.js + 1:1 error Unexpected var, use let or const instead no-var + 5:1 error Unexpected var, use let or const instead no-var + 13:1 error More than 1 blank line not allowed no-multiple-empty-lines + 17:2 error Unexpected var, use let or const instead no-var + 38:3 error Unexpected var, use let or const instead no-var + +/Users/seear/repos/wp-calypso/server/user-bootstrap/shared-utils.js + 4:1 error Missing external, internal dependencies docblocks wpcalypso/import-docblock + +/Users/seear/repos/wp-calypso/test/client/setup-test-framework.js + 12:1 error Line 12 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/test/test/helpers/use-sinon/index.js + 19:1 error Line 19 exceeds the maximum line length of 100 max-len + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 49:1 error Line 49 exceeds the maximum line length of 100 max-len + +/Users/seear/repos/wp-calypso/webpack.config.js + 30:1 error Missing JSDoc @returns for function valid-jsdoc + 31:1 error Line 31 exceeds the maximum line length of 100 max-len + 60:1 error Line 60 exceeds the maximum line length of 100 max-len + 73:1 error Line 73 exceeds the maximum line length of 100 max-len + 142:4 error Unnecessarily quoted property 'PROJECT_NAME' found quote-props + 145:1 error Line 145 exceeds the maximum line length of 100 max-len + 148:1 error Line 148 exceeds the maximum line length of 100 max-len + 196:1 error Line 196 exceeds the maximum line length of 100 max-len + 209:1 error Line 209 exceeds the maximum line length of 100 max-len + 230:1 error Line 230 exceeds the maximum line length of 100 max-len + 235:1 error Line 235 exceeds the maximum line length of 100 max-len + 239:2 error Mixed spaces and tabs no-mixed-spaces-and-tabs + 253:4 error Identifier 'dead_code' is not in camel case camelcase + 255:4 error Identifier 'if_return' is not in camel case camelcase + 256:4 error Identifier 'join_vars' is not in camel case camelcase + 257:4 error Identifier 'negate_iife' is not in camel case camelcase + 258:4 error Identifier 'screw_ie8' is not in camel case camelcase + +/Users/seear/repos/wp-calypso/webpack.config.node.js + 46:1 error Line 46 exceeds the maximum line length of 100 max-len + 47:1 error Line 47 exceeds the maximum line length of 100 max-len + 63:1 error Line 63 exceeds the maximum line length of 100 max-len + 69:2 error Missing semicolon semi + 116:1 error Line 116 exceeds the maximum line length of 100 max-len + 118:4 error Unnecessarily quoted property 'PROJECT_NAME' found quote-props + 121:1 error Line 121 exceeds the maximum line length of 100 max-len + 122:1 error Line 122 exceeds the maximum line length of 100 max-len + 123:1 error Line 123 exceeds the maximum line length of 100 max-len + 124:1 error Line 124 exceeds the maximum line length of 100 max-len + 125:1 error Line 125 exceeds the maximum line length of 100 max-len + 126:1 error Line 126 exceeds the maximum line length of 100 max-len + 127:1 error Line 127 exceeds the maximum line length of 100 max-len + 128:1 error Line 128 exceeds the maximum line length of 100 max-len + 129:1 error Line 129 exceeds the maximum line length of 100 max-len + 130:1 error Line 130 exceeds the maximum line length of 100 max-len + 131:1 error Line 131 exceeds the maximum line length of 100 max-len + 137:1 error Line 137 exceeds the maximum line length of 100 max-len + 142:1 error Line 142 exceeds the maximum line length of 100 max-len + +✖ 12401 problems (12391 errors, 10 warnings) + 1108 errors, 0 warnings potentially fixable with the `--fix` option. + diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 37030da2c15a8..11e9f6375cd46 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -13,7 +13,7 @@ "dev": true, "dependencies": { "ast-types": { - "version": "0.9.12", + "version": "0.9.14", "dev": true }, "esprima": { @@ -25,7 +25,7 @@ "dev": true }, "recast": { - "version": "0.12.7", + "version": "0.12.8", "dev": true }, "source-map": { @@ -77,7 +77,7 @@ "version": "5.3.0" }, "ajv-keywords": { - "version": "2.1.0" + "version": "2.1.1" }, "align-text": { "version": "0.1.4" @@ -185,7 +185,7 @@ "version": "0.2.3" }, "asn1.js": { - "version": "4.9.1" + "version": "4.9.2" }, "assert": { "version": "1.4.1" @@ -608,7 +608,7 @@ "version": "1.6.0", "dependencies": { "browserslist": { - "version": "2.5.1" + "version": "2.6.1" }, "semver": { "version": "5.4.1" @@ -874,10 +874,10 @@ } }, "caniuse-db": { - "version": "1.0.30000751" + "version": "1.0.30000756" }, "caniuse-lite": { - "version": "1.0.30000751" + "version": "1.0.30000756" }, "cardinal": { "version": "1.0.0", @@ -1564,7 +1564,7 @@ "version": "1.1.2" }, "draft-js": { - "version": "0.8.1" + "version": "0.10.4" }, "duplexer": { "version": "0.1.1" @@ -1946,7 +1946,7 @@ "dev": true, "dependencies": { "acorn": { - "version": "5.1.2", + "version": "5.2.1", "dev": true } } @@ -5667,7 +5667,7 @@ "version": "0.0.0" }, "qrcode.react": { - "version": "0.6.1" + "version": "0.7.2" }, "qs": { "version": "4.0.0" @@ -5929,7 +5929,12 @@ } }, "react-day-picker": { - "version": "6.0.2" + "version": "6.2.1", + "dependencies": { + "prop-types": { + "version": "15.6.0" + } + } }, "react-dom": { "version": "15.6.2" @@ -6636,7 +6641,7 @@ "version": "0.10.31" }, "string-kit": { - "version": "0.6.2", + "version": "0.6.3", "dev": true }, "string-length": { @@ -7290,7 +7295,7 @@ "version": "3.8.1", "dependencies": { "acorn": { - "version": "5.1.2" + "version": "5.2.1" }, "ansi-regex": { "version": "3.0.0" @@ -7376,7 +7381,7 @@ "dev": true }, "acorn": { - "version": "5.1.2", + "version": "5.2.1", "dev": true }, "body-parser": { @@ -7652,11 +7657,11 @@ "version": "0.1.9" }, "whatwg-encoding": { - "version": "1.0.2", + "version": "1.0.3", "dev": true, "dependencies": { "iconv-lite": { - "version": "0.4.13", + "version": "0.4.19", "dev": true } } @@ -7693,7 +7698,7 @@ "version": "0.0.2" }, "worker-farm": { - "version": "1.5.0", + "version": "1.5.1", "dev": true }, "wp-error": { diff --git a/package.json b/package.json index d1657d1ccf504..0821317666fc8 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "doctrine": "2.0.0", "dom-helpers": "2.4.0", "dom-scroll-into-view": "1.0.1", - "draft-js": "0.8.1", + "draft-js": "0.10.4", "email-validator": "1.0.1", "emoji-text": "0.2.6", "escape-regexp": "0.0.1", @@ -119,11 +119,11 @@ "prismjs": "1.6.0", "prop-types": "15.5.10", "q": "1.0.1", - "qrcode.react": "0.6.1", + "qrcode.react": "0.7.2", "qs": "4.0.0", "react": "15.6.2", "react-click-outside": "2.3.1", - "react-day-picker": "6.0.2", + "react-day-picker": "6.2.1", "react-dom": "15.6.2", "react-hot-loader": "1.3.1", "react-modal": "3.1.0", @@ -162,7 +162,7 @@ "wpcom-xhr-request": "1.1.1" }, "engines": { - "node": "6.11.2", + "node": "6.11.5", "npm": "3.10.10" }, "scripts": { diff --git a/public/images/upgrades/ideal.svg b/public/images/upgrades/ideal.svg new file mode 100644 index 0000000000000..ce4f0942f38ee --- /dev/null +++ b/public/images/upgrades/ideal.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/server/bundler/css-hot-reload.js b/server/bundler/css-hot-reload.js index 2dc80132b1820..07d2e968b2311 100644 --- a/server/bundler/css-hot-reload.js +++ b/server/bundler/css-hot-reload.js @@ -117,7 +117,13 @@ function setup( io ) { fs.readdirSync( PUBLIC_DIR ).forEach( function( file ) { if ( '.css' === file.slice( -4 ) ) { - var fullPath = path.join( PUBLIC_DIR, file ); + const fullPath = path.join( PUBLIC_DIR, file ); + publicCssFiles[ fullPath ] = md5File.sync( fullPath ); + } + } ); + fs.readdirSync( path.join( PUBLIC_DIR, 'sections' ) ).forEach( function( file ) { + if ( '.css' === file.slice( -4 ) ) { + const fullPath = path.join( PUBLIC_DIR, 'sections', file ); publicCssFiles[ fullPath ] = md5File.sync( fullPath ); } } ); diff --git a/server/pages/browsehappy.jade b/server/pages/browsehappy.jade index 2d9a49639fd93..65bbff4fec437 100644 --- a/server/pages/browsehappy.jade +++ b/server/pages/browsehappy.jade @@ -58,10 +58,13 @@ html(lang=lang, dir=isRTL ? 'rtl' : 'ltr', class=isFluidWidth ? 'is-fluid-width' h2.empty-content__title Unsupported Browser h3.empty-content__line | Unfortunately this page cannot be used by your browser. You can either + = ' ' a( href=dashboardUrl ) use the classic WordPress dashboard | , or + = ' ' a( href="https://browsehappy.com" ) upgrade your browser + = '.' diff --git a/server/pages/index.jade b/server/pages/index.jade index a164c1d35eace..6d59e5c3674c5 100644 --- a/server/pages/index.jade +++ b/server/pages/index.jade @@ -238,5 +238,19 @@ html(lang=lang, dir=isRTL ? 'rtl' : 'ltr', class=isFluidWidth ? 'is-fluid-width' script(src=urls[ chunk ]) script(type='text/javascript')!='window.AppBoot();' + script. + (function() { + if ( window.console && window.configData && 'development' !== window.configData.env ) { + console.log( "%cSTOP!", "color:#f00;font-size:xx-large" ); + console.log( + "%cWait! This browser feature runs code that can alter your website or its security, " + + "and is intended for developers. If you've been told to copy and paste something here " + + "to enable a feature, someone may be trying to compromise your account. Please make " + + "sure you understand the code and trust the source before adding anything here.", + "font-size:large;" + ); + } + })(); + noscript.wpcom-site__global-noscript |Please enable JavaScript in your browser to enjoy WordPress.com. diff --git a/server/pages/index.js b/server/pages/index.js index eb5f92c4972c8..1c3a9c40a7f62 100644 --- a/server/pages/index.js +++ b/server/pages/index.js @@ -165,7 +165,7 @@ function getDefaultContext( request ) { bodyClasses.push( 'pride' ); } - if ( request.context.sectionCss ) { + if ( request.context && request.context.sectionCss ) { const urls = utils.getCssUrls( request.context.sectionCss ); sectionCss = urls.ltr; sectionCssRtl = urls.rtl; diff --git a/webpack.config.js b/webpack.config.js index 1de1c6992cb1e..3ec9cbcb4effb 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -136,9 +136,7 @@ const webpackConfig = { }, plugins: _.compact( [ new webpack.DefinePlugin( { - 'process.env': { - NODE_ENV: JSON.stringify( bundleEnv ) - }, + 'process.env.NODE_ENV': JSON.stringify( bundleEnv ), 'PROJECT_NAME': JSON.stringify( config( 'project' ) ) } ), new webpack.IgnorePlugin( /^props$/ ),