Skip to content
This repository has been archived by the owner on Aug 18, 2020. It is now read-only.

Add support for ESLint doc url meta, update dependencies, support TypeScript 2.7 #84

Merged
merged 24 commits into from
Mar 15, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
def956d
Update circleci from v1 to v2
kaelig Mar 13, 2018
f5ecd19
Update dependencies that support the new URL metadata
kaelig Mar 13, 2018
086eb09
Add new rules coming from the dependency update
kaelig Mar 13, 2018
20b09d2
Update changelog
kaelig Mar 13, 2018
0fee24d
v20.0.0-beta.1
kaelig Mar 13, 2018
f21b18d
Fix rule name
kaelig Mar 14, 2018
5662ed4
Improve eslint output
kaelig Mar 14, 2018
55078ee
Use new --require flag (compilers is deprecated) for mocha
kaelig Mar 14, 2018
ed54a32
v20.0.0-beta.2
kaelig Mar 14, 2018
5c712bf
Update rule to match the new implementation
kaelig Mar 14, 2018
f26e5b1
v20.0.0-beta.3
kaelig Mar 14, 2018
5270272
Add missing .
kaelig Mar 14, 2018
d02b662
Mention new TypeScript version support in Changelog
kaelig Mar 14, 2018
d2f1785
Allow graphql, css, sass, scss, less, styl file extensions in imports
kaelig Mar 14, 2018
23be4b8
Turn on jest/valid-expect-in-promise rule
kaelig Mar 14, 2018
f18da27
Turn rule react/no-this-in-sfc on
kaelig Mar 14, 2018
9978763
Turn rule react/jsx-child-element-spacing on
kaelig Mar 14, 2018
5c8f31e
Turn jest/lowercase-name rule off
kaelig Mar 14, 2018
c94a6f0
Rewrite rules in imperative tone
kaelig Mar 14, 2018
1bd52b8
Add docs meta to custom rules
kaelig Mar 14, 2018
1eabeb0
v20.0.0-beta.4
kaelig Mar 14, 2018
5c2df96
Apply category changes - thanks @lemonmade ❤️
kaelig Mar 15, 2018
8e08002
Merge pull request #87 from Shopify/docs-add-meta
kaelig Mar 15, 2018
347d913
Merge pull request #86 from Shopify/docs-meta
kaelig Mar 15, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
version: 2
jobs:
build:
working_directory: ~/app
docker:
- image: circleci/node:8.9.4
steps:
- checkout
- restore_cache:
keys:
# Find a cache corresponding to this specific package.json checksum
# when this file is changed, this key will fail
- v1-npm-deps-{{ arch }}-{{ checksum "yarn.lock" }}
# Find the most recent cache used from any branch
- v1-npm-deps-{{ arch }} # used if above checksum fails
- run: yarn
- save_cache:
key: v1-npm-deps-{{ arch }}-{{ checksum "yarn.lock" }}
paths:
- node_modules
- run: yarn run check
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably would have been better as a separate PR?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I got a bit carried away 😅

41 changes: 40 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,45 @@
# Changelog

<!-- ## [Unreleased] -->
## [Unreleased]
* **Breaking:** the version of TypeScript supported by this plugin is 2.7.x (in line with [typescript-eslint-parser](https://github.com/eslint/typescript-eslint-parser)’s TypeScript support)
* Updated dependencies that support the new ESLint documentation URL metadata. Errors from these plugins are accompanied by a link to the documentation for the broken rule.
* Dependencies are now strictly versioned for tighter control over the exact rules the plugin enforces.

| Package | old | new |
| ------- | --- | --- |
| `eslint-plugin-ava` | `^4.4.0` | `4.5.1` |
| `eslint-plugin-import` | `^2.8.0` | `2.9.0` |
| `eslint-plugin-jest` | `^21.5.0` | `21.14.1` |
| `eslint-plugin-lodash` | `^2.5.0` | `2.6.1` |
| `eslint-plugin-node` | `^5.2.1` | `6.0.1` |
| `eslint-plugin-prettier` | `^2.4.0` | `2.6.0` |
| `eslint-plugin-promise` | `^3.6.0` | `3.7.0` |
| `eslint-plugin-react` | `^7.5.1` | `7.7.0` |
| `eslint-plugin-typescript` | `^0.8.1` | `0.10.0` |

* Added rules:
- [`react/forbid-dom-props`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/forbid-dom-props.md) (disabled)
- [`react/jsx-child-element-spacing`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-child-element-spacing.md) **error**
- [`react/jsx-max-depth`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-max-depth.md) (disabled)
- [`react/jsx-sort-default-props`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-sort-default-props.md) (disabled)
- [`react/no-this-in-sfc`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-this-in-sfc.md) **error**
- [`import/group-exports`](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/group-exports.md) (disabled)
- [`import/no-self-import`](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-self-import.md) **error**
- [`import/no-default-export`](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-default-export.md) (disabled)
- [`import/no-useless-path-segments`](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-useless-path-segments.md) **error**
- [`jest/prefer-expect-assertions`](https://github.com/jest-community/eslint-plugin-jest/blob/master/docs/rules/prefer-expect-assertions.md) (disabled)
- [`jest/valid-expect-in-promise`](https://github.com/jest-community/eslint-plugin-jest/blob/master/docs/rules/valid-expect-in-promise.md) **error**
- [`jest/valid-describe`](https://github.com/jest-community/eslint-plugin-jest/blob/master/docs/rules/valid-describe.md) **error**
- [`jest/consistent-test-it`](https://github.com/jest-community/eslint-plugin-jest/blob/master/docs/rules/consistent-test-it.md) **error**
- [`jest/no-test-prefixes`](https://github.com/jest-community/eslint-plugin-jest/blob/master/docs/rules/no-test-prefixes.md) **error**
- [`jest/lowercase-name`](https://github.com/jest-community/eslint-plugin-jest/blob/master/docs/rules/lowercase-name.md) (disabled)
- [`jest/no-jest-import`](https://github.com/jest-community/eslint-plugin-jest/blob/master/docs/rules/no-jest-import.md) **error**
- [`promise/valid-params`](https://github.com/xjamundx/eslint-plugin-promise/blob/master/docs/rules/valid-params.md) **error**
- [`promise/no-new-statics`](https://github.com/xjamundx/eslint-plugin-promise/blob/master/docs/rules/no-new-statics.md) (disabled)
- [`typescript/explicit-function-return-type`](https://github.com/nzakas/eslint-plugin-typescript/blob/master/docs/rules/explicit-function-return-type.md) (disabled)
- [`typescript/no-non-null-assertion`](https://github.com/nzakas/eslint-plugin-typescript/blob/master/docs/rules/no-non-null-assertion.md) **error**
* Updated `import/extensions` due to changes in its implementation: some extensions are explicitly allowed in `import`s: `.svg`, `.png`, `.jpg`, `.ico`. `.json` is still required as well.
* Chore: updated CircleCI from v1 to v2.

## [19.0.1] - 2018-03-12

Expand Down
24 changes: 12 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,24 +113,24 @@ A node project that will use Babel for transpilation would need the following ES

This plugin provides the following custom rules, which are included as appropriate in all core linting configs:

- [binary-assignment-parens](docs/rules/binary-assignment-parens.md): Requires (or disallows) assignments of binary, boolean-producing expressions to be wrapped in parentheses.
- [class-property-semi](docs/rules/class-property-semi.md): Requires (or disallows) semicolons for class properties.
- [jquery-dollar-sign-reference](docs/rules/jquery-dollar-sign-reference.md): Requires that all jQuery objects are assigned to references prefixed with `$`.
- [jsx-no-complex-expressions](docs/rules/jsx-no-complex-expressions.md): Disallows complex expressions embedded in in JSX.
- [jsx-no-hardcoded-content](docs/rules/jsx-no-hardcoded-content.md): Disallows hardcoded content in JSX.
- [no-useless-computed-properties](docs/rules/no-useless-computed-properties.md): Prevents the usage of unnecessary computed properties.
- [binary-assignment-parens](docs/rules/binary-assignment-parens.md): Require (or disallow) assignments of binary, boolean-producing expressions to be wrapped in parentheses.
- [class-property-semi](docs/rules/class-property-semi.md): Require (or disallow) semicolons for class properties.
- [jquery-dollar-sign-reference](docs/rules/jquery-dollar-sign-reference.md): Require that all jQuery objects are assigned to references prefixed with `$`.
- [jsx-no-complex-expressions](docs/rules/jsx-no-complex-expressions.md): Disallow complex expressions embedded in in JSX.
- [jsx-no-hardcoded-content](docs/rules/jsx-no-hardcoded-content.md): Disallow hardcoded content in JSX.
- [no-useless-computed-properties](docs/rules/no-useless-computed-properties.md): Prevent the usage of unnecessary computed properties.
- [polaris-no-bare-stack-item](docs/rules/polaris-no-bare-stack-item.md): Disallow the use of Polaris’s `Stack.Item` without any custom props.
- [polaris-prefer-sectioned-prop](docs/rules/polaris-prefer-sectioned-prop.md): Prefer the use of the `sectioned` props in Polaris components instead of wrapping all contents in a `Section` component.
- [prefer-class-properties](docs/rules/prefer-class-properties.md): Prefer class properties to assignment of literals in constructors.
- [prefer-early-return](docs/rules/prefer-early-return.md): Prefer early returns over full-body conditional wrapping in function declarations.
- [prefer-module-scope-constants](docs/rules/prefer-module-scope-constants.md): Prefer that screaming snake case variables always be defined using `const`, and always appear at module scope.
- [prefer-twine](docs/rules/prefer-twine.md): Prefer Twine over Bindings as the name for twine imports.
- [react-initialize-state](docs/rules/react-initialize-state.md): Requires that React component state be initialized when it has a non-empty type.
- [react-type-state](docs/rules/react-type-state.md): Requires that React component state be typed in TypeScript.
- [restrict-full-import](docs/rules/restrict-full-import.md): Prevents importing the entirety of a package.
- [sinon-no-restricted-features](docs/rules/sinon-no-restricted-features.md): Restricts the use of specified sinon features.
- [sinon-prefer-meaningful-assertions](docs/rules/sinon-prefer-meaningful-assertions.md): Requires the use of meaningful sinon assertions through sinon.assert or sinon-chai.
- [webpack/no-unnamed-dynamic-imports](docs/rules/webpack/no-unnamed-dynamic-imports.md): Requires that all dynamic imports contain a `webpackChunkName` comment.
- [react-initialize-state](docs/rules/react-initialize-state.md): Require that React component state be initialized when it has a non-empty type.
- [react-type-state](docs/rules/react-type-state.md): Require that React component state be typed in TypeScript.
- [restrict-full-import](docs/rules/restrict-full-import.md): Prevent importing the entirety of a package.
- [sinon-no-restricted-features](docs/rules/sinon-no-restricted-features.md): Restrict the use of specified sinon features.
- [sinon-prefer-meaningful-assertions](docs/rules/sinon-prefer-meaningful-assertions.md): Require the use of meaningful sinon assertions through sinon.assert or sinon-chai.
- [webpack/no-unnamed-dynamic-imports](docs/rules/webpack/no-unnamed-dynamic-imports.md): Require that all dynamic imports contain a `webpackChunkName` comment.

## Creating New Rules

Expand Down
15 changes: 0 additions & 15 deletions circle.yml

This file was deleted.

2 changes: 1 addition & 1 deletion docs/rules/binary-assignment-parens.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Requires (or disallows) assignments of binary, boolean-producing expressions to be wrapped in parentheses. (binary-assignment-parens)
# Require (or disallow) assignments of binary, boolean-producing expressions to be wrapped in parentheses. (binary-assignment-parens)

## Rule Details

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/class-property-semi.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Requires (or disallows) semicolons for class properties. (class-property-semi)
# Require (or disallow) semicolons for class properties. (class-property-semi)

## Rule Details

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/jquery-dollar-sign-reference.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Requires that all jQuery objects are assigned to references prefixed with `$`. (jquery-dollar-sign-reference)
# Require that all jQuery objects are assigned to references prefixed with `$`. (jquery-dollar-sign-reference)

Identifying a reference as being a jQuery object makes it immediately obvious what methods are available on that reference.

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/jsx-no-complex-expressions.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Disallows complex expressions embedded in in JSX. (jsx-no-complex-expressions)
# Disallow complex expressions embedded in in JSX. (jsx-no-complex-expressions)

Having complex conditionals embedded in JSX can make it harder to read. This rule aims to improve the readability of JSX by preventing the use of complex expressions.

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/jsx-no-hardcoded-content.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Disallows hardcoded content in JSX. (jsx-no-hardcoded-content)
# Disallow hardcoded content in JSX. (jsx-no-hardcoded-content)

Many JSX components accept children and other properties that are intended for UI content. In an internationalized app, content is generally provided to these components through a translation function, not directly as strings. This rule enforces that components not accept harcoded literal content.

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/no-fully-static-classes.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Prevents the declaration of classes consisting only of static members. (no-fully-static-classes)
# Prevent the declaration of classes consisting only of static members. (no-fully-static-classes)

## Rule Details

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/no-useless-computed-properties.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Prevents the usage of unnecessary computed properties. (no-useless-computed-properties)
# Prevent the usage of unnecessary computed properties. (no-useless-computed-properties)

Computed properties allow you to define methods and properties of an object or class without having to know exact name of the key.

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/polaris-prefer-sectioned-prop.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Polaris provides a convenience `sectioned` prop for some components that wraps t

## Rule details

This rule currently requires the use of the `sectioned` prop over the `Section` subcomponent for the following components:
This rule currently Require the use of the `sectioned` prop over the `Section` subcomponent for the following components:

* [`Card`](https://polaris.shopify.com/components/structure/card)
* [`Popover`](https://polaris.shopify.com/components/overlays/popover)
Expand Down
2 changes: 1 addition & 1 deletion docs/rules/react-initialize-state.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Requires that React component state be initialized when it has a non-empty type (react-initialize-state)
# Require that React component state be initialized when it has a non-empty type (react-initialize-state)

Forgetting to initialize a React component’s state can lead to hard-to-understand errors when you try to access that state during the component’s lifecycle. This rule forces you to initialize state when you have provided a non-empty Flow or TypeScript type for state to `React.Component` or `React.PureComponent`.

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/react-type-state.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Requires that React component state be typed in TypeScript. (react-type-state)
# Require that React component state be typed in TypeScript. (react-type-state)

TypeScript will not correctly check your state instance property against the state declared in the component’s type initialization unless an explicit type annotation is provided. This rule enforces that the type annotation is provided when it detects a meaningful state type in a TypeScript React component.

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/restrict-full-import.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Prevents importing the entirety of a package. (restrict-full-import)
# Prevent importing the entirety of a package. (restrict-full-import)

Importing the entirety of a large module can be undesirable because it becomes harder to track what properties are being used.

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/sinon-no-restricted-features.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Restricts the use of specified sinon features. (sinon-no-restricted-features)
# Restrict the use of specified sinon features. (sinon-no-restricted-features)

[`sinon`](http://sinonjs.org) offers many of features, some of which you may not want to use in your codebase.

Expand Down
2 changes: 1 addition & 1 deletion docs/rules/sinon-prefer-meaningful-assertions.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Requires the use of meaningful sinon assertions through sinon.assert or sinon-chai. (sinon-prefer-meaningful-assertions)
# Require the use of meaningful sinon assertions through sinon.assert or sinon-chai. (sinon-prefer-meaningful-assertions)

Sinon provides [spy-specific assertions](http://sinonjs.org/docs/#assertions) that have more useful error messages. These same, more meaningful assertions are also available for BDD-style tests using [sinon-chai](https://github.com/domenic/sinon-chai).

Expand Down
4 changes: 2 additions & 2 deletions lib/config/rules/babel.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
module.exports = {
// Ignores capitalized decorators (@Decorator)
'babel/new-cap': ['error', {newIsCap: true, capIsNew: false}],
// doesn't complain about export x from "mod"; or export * as x from "mod";
// Doesn't complain about export x from "mod"; or export * as x from "mod";
'babel/object-curly-spacing': ['error', 'never'],
// doesn't fail when inside class properties
// Doesn't fail when inside class properties
'babel/no-invalid-this': 'error',
// Rule to flag missing semicolons
'babel/semi': 'error',
Expand Down
6 changes: 3 additions & 3 deletions lib/config/rules/best-practices.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ module.exports = {
'guard-for-in': 'error',
// Disallow the use of alert, confirm, and prompt
'no-alert': 'error',
// disallow lexical declarations in case clauses
// Disallow lexical declarations in case clauses
'no-case-declarations': 'error',
// Disallow use of arguments.caller or arguments.callee
'no-caller': 'error',
Expand Down Expand Up @@ -79,7 +79,7 @@ module.exports = {
'no-multi-str': 'off',
// Disallow use of new operator for Function object
'no-new-func': 'error',
// Disallows creating new instances of String, Number, and Boolean
// Disallow creating new instances of String, Number, and Boolean
'no-new-wrappers': 'error',
// Disallow use of new operator when not part of the assignment or comparison
'no-new': 'error',
Expand All @@ -100,7 +100,7 @@ module.exports = {
'no-restricted-properties': 'off',
// Disallow use of assignment in return statement
'no-return-assign': 'error',
// Disallows unnecessary return await
// Disallow unnecessary return await
'no-return-await': 'error',
// Disallow use of javascript: urls.,
'no-script-url': 'off',
Expand Down
12 changes: 6 additions & 6 deletions lib/config/rules/flowtype.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ module.exports = {
'flowtype/generic-spacing': ['error', 'never'],
// Checks for duplicate properties in Object annotations
'flowtype/no-dupe-keys': 'error',
// Disallows $FlowFixMe comment suppressions
// Disallow $FlowFixMe comment suppressions
'flowtype/no-flow-fix-me-comments': 'off',
// Disallows use of primitive constructors as types, such as Boolean, Number and String.
// Disallow use of primitive constructors as types, such as Boolean, Number and String.
'flowtype/no-primitive-constructor-types': 'error',
// Disallows Flow type imports, aliases, and annotations in files missing a valid Flow file declaration (or a @noflow annotation).
// Disallow Flow type imports, aliases, and annotations in files missing a valid Flow file declaration (or a @noflow annotation).
'flowtype/no-types-missing-file-annotation': 'error',
// Warns against weak type annotations any, Object and Function.
'flowtype/no-weak-types': [
Expand All @@ -28,13 +28,13 @@ module.exports = {
],
// Enforces consistent separators between properties in Flow object types.
'flowtype/object-type-delimiter': ['error', 'comma'],
// Requires that all function parameters have type annotations.
// Require that all function parameters have type annotations.
'flowtype/require-parameter-type': 'off',
// Requires that functions have return type annotation.
// Require that functions have return type annotation.
'flowtype/require-return-type': 'off',
// Makes sure that files have a valid @flow annotation.
'flowtype/require-valid-file-annotation': ['error', 'always'],
// Requires that all variable declarators have type annotations.
// Require that all variable declarators have type annotations.
'flowtype/require-variable-type': 'off',
// Enforces consistent use of semicolons after type aliases.
'flowtype/semi': ['error', 'always'],
Expand Down
26 changes: 25 additions & 1 deletion lib/config/rules/import.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ module.exports = {
'import/no-absolute-path': 'error',
// Forbid Webpack loader syntax in imports
'import/no-webpack-loader-syntax': 'error',
// Ensures that there are no useless path segments
'import/no-useless-path-segments': 'error',

// Helpful warnings

Expand All @@ -40,6 +42,8 @@ module.exports = {
'import/no-extraneous-dependencies': 'error',
// Forbid the use of mutable exports with var or let.
'import/no-mutable-exports': 'error',
// Forbid a module from importing itself
'import/no-self-import': 'error',

// Module systems

Expand All @@ -61,7 +65,23 @@ module.exports = {
// Report namespace imports
'import/no-namespace': 'off',
// Ensure consistent use of file extension within the import path
'import/extensions': ['error', {js: 'never', json: 'always'}],
'import/extensions': [
'error',
{
js: 'never',
json: 'always',
svg: 'always',
png: 'always',
jpg: 'always',
ico: 'always',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also want .graphql/ .css/ .scss?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, addressed in d2f1785

graphql: 'always',
css: 'always',
sass: 'always',
scss: 'always',
less: 'always',
styl: 'always',
},
],
// Enforce a convention in module import order
'import/order': [
'error',
Expand All @@ -79,4 +99,8 @@ module.exports = {
'import/no-unassigned-import': 'off',
// Forbid anonymous values as default exports
'import/no-anonymous-default-export': 'error',
// Prohibit default exports. Mostly an inverse of prefer-default-export.
'import/no-default-export': 'off',
// Reports when named exports are not grouped together in a single export declaration or when multiple assignments to CommonJS module.exports or exports object are present in a single file.
'import/group-exports': 'off',
};
Loading