UNPKG

react-kiwi-dropdown

Version:

A minimal, easy-to-use and highly adjustable dropdown component made with ReactJS.

1,972 lines (1,395 loc) 118 kB
<a name="eslint-plugin-flowtype"></a> # eslint-plugin-flowtype [![NPM version](http://img.shields.io/npm/v/eslint-plugin-flowtype.svg?style=flat-square)](https://www.npmjs.org/package/eslint-plugin-flowtype) [![Travis build status](http://img.shields.io/travis/gajus/eslint-plugin-flowtype/master.svg?style=flat-square)](https://travis-ci.org/gajus/eslint-plugin-flowtype) [![js-canonical-style](https://img.shields.io/badge/code%20style-canonical-blue.svg?style=flat-square)](https://github.com/gajus/canonical) [Flow type](http://flowtype.org/) linting rules for ESLint. * [eslint-plugin-flowtype](#eslint-plugin-flowtype) * [Installation](#eslint-plugin-flowtype-installation) * [Configuration](#eslint-plugin-flowtype-configuration) * [Shareable configurations](#eslint-plugin-flowtype-configuration-shareable-configurations) * [Community maintained configurations](#eslint-plugin-flowtype-configuration-community-maintained-configurations) * [Settings](#eslint-plugin-flowtype-settings) * [`onlyFilesWithFlowAnnotation`](#eslint-plugin-flowtype-settings-onlyfileswithflowannotation) * [Rules](#eslint-plugin-flowtype-rules) * [`array-style-complex-type`](#eslint-plugin-flowtype-rules-array-style-complex-type) * [`array-style-simple-type`](#eslint-plugin-flowtype-rules-array-style-simple-type) * [`boolean-style`](#eslint-plugin-flowtype-rules-boolean-style) * [`define-flow-type`](#eslint-plugin-flowtype-rules-define-flow-type) * [`delimiter-dangle`](#eslint-plugin-flowtype-rules-delimiter-dangle) * [`generic-spacing`](#eslint-plugin-flowtype-rules-generic-spacing) * [`newline-after-flow-annotation`](#eslint-plugin-flowtype-rules-newline-after-flow-annotation) * [`no-dupe-keys`](#eslint-plugin-flowtype-rules-no-dupe-keys) * [`no-existential-type`](#eslint-plugin-flowtype-rules-no-existential-type) * [`no-flow-fix-me-comments`](#eslint-plugin-flowtype-rules-no-flow-fix-me-comments) * [`no-mutable-array`](#eslint-plugin-flowtype-rules-no-mutable-array) * [`no-primitive-constructor-types`](#eslint-plugin-flowtype-rules-no-primitive-constructor-types) * [`no-types-missing-file-annotation`](#eslint-plugin-flowtype-rules-no-types-missing-file-annotation) * [`no-unused-expressions`](#eslint-plugin-flowtype-rules-no-unused-expressions) * [`no-weak-types`](#eslint-plugin-flowtype-rules-no-weak-types) * [`object-type-delimiter`](#eslint-plugin-flowtype-rules-object-type-delimiter) * [`require-exact-type`](#eslint-plugin-flowtype-rules-require-exact-type) * [`require-parameter-type`](#eslint-plugin-flowtype-rules-require-parameter-type) * [`require-return-type`](#eslint-plugin-flowtype-rules-require-return-type) * [`require-types-at-top`](#eslint-plugin-flowtype-rules-require-types-at-top) * [`require-valid-file-annotation`](#eslint-plugin-flowtype-rules-require-valid-file-annotation) * [`require-variable-type`](#eslint-plugin-flowtype-rules-require-variable-type) * [`semi`](#eslint-plugin-flowtype-rules-semi) * [`sort-keys`](#eslint-plugin-flowtype-rules-sort-keys) * [`space-after-type-colon`](#eslint-plugin-flowtype-rules-space-after-type-colon) * [`space-before-generic-bracket`](#eslint-plugin-flowtype-rules-space-before-generic-bracket) * [`space-before-type-colon`](#eslint-plugin-flowtype-rules-space-before-type-colon) * [`type-id-match`](#eslint-plugin-flowtype-rules-type-id-match) * [`type-import-style`](#eslint-plugin-flowtype-rules-type-import-style) * [`union-intersection-spacing`](#eslint-plugin-flowtype-rules-union-intersection-spacing) * [`use-flow-type`](#eslint-plugin-flowtype-rules-use-flow-type) * [`valid-syntax`](#eslint-plugin-flowtype-rules-valid-syntax) <a name="eslint-plugin-flowtype-installation"></a> ## Installation 1. Install [ESLint](https://www.github.com/eslint/eslint). 1. Install [`babel-eslint`](https://github.com/babel/babel-eslint) parser (ESLint parser [does not support type annotations](https://github.com/eslint/eslint/issues/2157)). 1. Install [`eslint-plugin-flowtype`](https://github.com/gajus/eslint-plugin-flowtype) plugin. <!-- --> ```sh npm install eslint --save-dev npm install babel-eslint --save-dev npm install eslint-plugin-flowtype --save-dev ``` <a name="eslint-plugin-flowtype-configuration"></a> ## Configuration 1. Set `parser` property to `babel-eslint`. 1. Add `plugins` section and specify `eslint-plugin-flowtype` as a plugin. 1. Enable rules. <!-- --> ```json { "parser": "babel-eslint", "plugins": [ "flowtype" ], "rules": { "flowtype/boolean-style": [ 2, "boolean" ], "flowtype/define-flow-type": 1, "flowtype/delimiter-dangle": [ 2, "never" ], "flowtype/generic-spacing": [ 2, "never" ], "flowtype/no-primitive-constructor-types": 2, "flowtype/no-types-missing-file-annotation": 2, "flowtype/no-weak-types": 2, "flowtype/object-type-delimiter": [ 2, "comma" ], "flowtype/require-parameter-type": 2, "flowtype/require-return-type": [ 2, "always", { "annotateUndefined": "never" } ], "flowtype/require-valid-file-annotation": 2, "flowtype/semi": [ 2, "always" ], "flowtype/space-after-type-colon": [ 2, "always" ], "flowtype/space-before-generic-bracket": [ 2, "never" ], "flowtype/space-before-type-colon": [ 2, "never" ], "flowtype/type-id-match": [ 2, "^([A-Z][a-z0-9]+)+Type$" ], "flowtype/union-intersection-spacing": [ 2, "always" ], "flowtype/use-flow-type": 1, "flowtype/valid-syntax": 1 }, "settings": { "flowtype": { "onlyFilesWithFlowAnnotation": false } } } ``` <a name="eslint-plugin-flowtype-configuration-shareable-configurations"></a> ### Shareable configurations <a name="eslint-plugin-flowtype-configuration-shareable-configurations-recommended"></a> #### Recommended This plugin exports a [recommended configuration](./src/configs/recommended.json) that enforces Flow type good practices. To enable this configuration use the extends property in your `.eslintrc` config file: ```json { "extends": [ "plugin:flowtype/recommended" ], "plugins": [ "flowtype" ] } ``` See [ESLint documentation](http://eslint.org/docs/user-guide/configuring#extending-configuration-files) for more information about extending configuration files. <a name="eslint-plugin-flowtype-configuration-community-maintained-configurations"></a> ### Community maintained configurations The following are third-party submitted/ maintained configurations of `eslint-plugin-flowtype`: * https://github.com/wemake-services/eslint-config-flowtype-essential <a name="eslint-plugin-flowtype-settings"></a> ## Settings <a name="eslint-plugin-flowtype-settings-onlyfileswithflowannotation"></a> ### <code>onlyFilesWithFlowAnnotation</code> When `true`, only checks files with a [`@flow` annotation](http://flowtype.org/docs/about-flow.html#gradual) in the first comment. ```js { "settings": { "flowtype": { "onlyFilesWithFlowAnnotation": true } } } ``` <a name="eslint-plugin-flowtype-rules"></a> ## Rules <!-- Rules are sorted alphabetically. --> <a name="eslint-plugin-flowtype-rules-array-style-complex-type"></a> ### <code>array-style-complex-type</code> _The `--fix` option on the command line automatically fixes problems reported by this rule._ Enforces a particular annotation style of complex types. Type is considered complex in these cases: * [Maybe type](https://flow.org/en/docs/types/maybe/) * [Function type](https://flow.org/en/docs/types/functions/) * [Object type](https://flow.org/en/docs/types/objects/) * [Tuple type](https://flow.org/en/docs/types/tuples/) * [Union type](https://flow.org/en/docs/types/unions/) * [Intersection type](https://flow.org/en/docs/types/intersections/) This rule takes one argument. If it is `'verbose'` then a problem is raised when using `Type[]` instead of `Array<Type>`. If it is `'shorthand'` then a problem is raised when using `Array<Type>` instead of `Type[]`. The default value is `'verbose'`. The following patterns are considered problems: ```js type X = (?string)[] // Message: Use "Array<?string>", not "(?string)[]" // Options: ["verbose"] type X = (?string)[] // Message: Use "Array<?string>", not "(?string)[]" // Options: ["shorthand"] type X = Array<?string> // Message: Use "(?string)[]", not "Array<?string>" // Options: ["shorthand"] type X = Array<{foo: string}> // Message: Use "{foo: string}[]", not "Array<{foo: string}>" type X = (string | number)[] // Message: Use "Array<string | number>", not "(string | number)[]" type X = (string & number)[] // Message: Use "Array<string & number>", not "(string & number)[]" type X = [string, number][] // Message: Use "Array<[string, number]>", not "[string, number][]" type X = {foo: string}[] // Message: Use "Array<{foo: string}>", not "{foo: string}[]" type X = (string => number)[] // Message: Use "Array<string => number>", not "(string => number)[]" type X = { foo: string, bar: number }[] // Message: Use "Array<{ foo: string, bar: number }>", not "{ foo: string, bar: number }[]" type X = { foo: string, bar: number, quo: boolean, hey: Date }[] // Message: Use "Array<Type>", not "Type[]" ``` The following patterns are not considered problems: ```js type X = Array<?string> // Options: ["verbose"] type X = Array<?string> // Options: ["shorthand"] type X = (?string)[] // Options: ["shorthand"] type X = Array<string> // Options: ["shorthand"] // Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}} type X = Array<?string> ``` <a name="eslint-plugin-flowtype-rules-array-style-simple-type"></a> ### <code>array-style-simple-type</code> _The `--fix` option on the command line automatically fixes problems reported by this rule._ Enforces a particular array type annotation style of simple types. Type is considered simple in these cases: * [Primitive types](https://flow.org/en/docs/types/primitives/) * [Literal types](https://flow.org/en/docs/types/literals/) * [Mixed type](https://flow.org/en/docs/types/mixed/) * [Any type](https://flow.org/en/docs/types/any/) * [Class type](https://flow.org/en/docs/types/classes/) * [Generic type](https://flow.org/en/docs/types/generics/) * Array type [shorthand notation](https://flow.org/en/docs/types/arrays/#toc-array-type-shorthand-syntax) This rule takes one argument. If it is `'verbose'` then a problem is raised when using `Type[]` instead of `Array<Type>`. If it is `'shorthand'` then a problem is raised when using `Array<Type>` instead of `Type[]`. The default value is `'verbose'`. The following patterns are considered problems: ```js type X = string[] // Message: Use "Array<string>", not "string[]" // Options: ["verbose"] type X = string[] // Message: Use "Array<string>", not "string[]" // Options: ["shorthand"] type X = Array<string> // Message: Use "string[]", not "Array<string>" type X = Date[] // Message: Use "Array<Date>", not "Date[]" type X = Promise<string>[] // Message: Use "Array<Promise<string>>", not "Promise<string>[]" type X = $Keys<{foo: string}>[] // Message: Use "Array<$Keys<{foo: string}>>", not "$Keys<{foo: string}>[]" type X = any[] // Message: Use "Array<any>", not "any[]" type X = mixed[] // Message: Use "Array<mixed>", not "mixed[]" type X = void[] // Message: Use "Array<void>", not "void[]" type X = null[] // Message: Use "Array<null>", not "null[]" type X = string[][] // Message: Use "Array<string[]>", not "string[][]" // Message: Use "Array<string>", not "string[]" type X = Promise<{ foo: string, bar: number }>[] // Message: Use "Array<Promise<{ foo: string, bar: number }>>", not "Promise<{ foo: string, bar: number }>[]" type X = Promise<{ foo: string, bar: number, quo: boolean }>[] // Message: Use "Array<Type>", not "Type[]" ``` The following patterns are not considered problems: ```js type X = Array<string> // Options: ["verbose"] type X = Array<string> // Options: ["shorthand"] type X = string[] type X = Array<Array<string>> // Options: ["verbose"] type X = (?string)[] // Options: ["verbose"] // Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}} type X = string[] ``` <a name="eslint-plugin-flowtype-rules-boolean-style"></a> ### <code>boolean-style</code> _The `--fix` option on the command line automatically fixes problems reported by this rule._ Enforces a particular style for boolean type annotations. This rule takes one argument. If it is `'boolean'` then a problem is raised when using `bool` instead of `boolean`. If it is `'bool'` then a problem is raised when using `boolean` instead of `bool`. The default value is `'boolean'`. The following patterns are considered problems: ```js type X = bool // Message: Use "boolean", not "bool" // Options: ["boolean"] type X = bool // Message: Use "boolean", not "bool" // Options: ["bool"] type X = boolean // Message: Use "bool", not "boolean" ``` The following patterns are not considered problems: ```js type X = boolean // Options: ["boolean"] type X = boolean // Options: ["bool"] type X = bool // Options: ["boolean"] // Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}} type X = bool ``` <a name="eslint-plugin-flowtype-rules-define-flow-type"></a> ### <code>define-flow-type</code> Marks Flow type identifiers as defined. Used to suppress [`no-undef`](http://eslint.org/docs/rules/no-undef) reporting of type identifiers. The following patterns are not considered problems: ```js var a: AType // Additional rules: {"no-undef":2} var a: AType; var b: AType // Additional rules: {"no-undef":2} var a; (a: AType) // Additional rules: {"no-undef":2} var a: AType<BType> // Additional rules: {"no-undef":2} type A = AType // Additional rules: {"no-undef":2} declare type A = number // Additional rules: {"no-undef":2} opaque type A = AType // Additional rules: {"no-undef":2} function f(a: AType) {} // Additional rules: {"no-undef":2} function f(a: AType.a) {} // Additional rules: {"no-undef":2} function f(a: AType.a.b) {} // Additional rules: {"no-undef":2} function f(a): AType {}; var a: AType // Additional rules: {"no-undef":2} function f(a): AType {} // Additional rules: {"no-undef":2} class C { a: AType } // Additional rules: {"no-undef":2} class C { a: AType.a } // Additional rules: {"no-undef":2} class C { a: AType.a.b } // Additional rules: {"no-undef":2} class C implements AType {} // Additional rules: {"no-undef":2} interface AType {} // Additional rules: {"no-undef":2} declare interface A {} // Additional rules: {"no-undef":2} ({ a: ({b() {}}: AType) }) // Additional rules: {"no-undef":2} type X = {Y<AType>(): BType} // Additional rules: {"no-undef":2} interface AType<BType> {} // Additional rules: {"no-undef":2} var a: AType // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} var a: AType; var b: AType // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} var a; (a: AType) // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} var a: AType<BType> // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} type A = AType // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} declare type A = number // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} opaque type A = AType // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} function f(a: AType) {} // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} function f(a: AType.a) {} // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} function f(a: AType.a.b) {} // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} function f(a): AType {}; var a: AType // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} function f(a): AType {} // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} class C { a: AType } // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} class C { a: AType.a } // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} class C { a: AType.a.b } // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} class C implements AType {} // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} interface AType {} // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} declare interface A {} // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} ({ a: ({b() {}}: AType) }) // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} type X = {Y<AType>(): BType} // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} interface AType<BType> {} // Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]} ``` <a name="eslint-plugin-flowtype-rules-delimiter-dangle"></a> ### <code>delimiter-dangle</code> _The `--fix` option on the command line automatically fixes problems reported by this rule._ Enforces consistent use of trailing commas in Object and Tuple annotations. This rule takes one argument which mirrors ESLint's default `comma-dangle` rule. If it is `'never'` then a problem is raised when there is a trailing comma. If it is `'always'` then a problem is raised when there is no trailing comma. If it is `'always-multiline'` then a problem is raised when there is no trailing comma on a multi-line definition, or there _is_ a trailing comma on a single-line definition. If it is `'only-multiline'` then a problem is raised when there is a trailing comma on a single-line definition. It allows, but does not enforce, trailing commas on multi-line definitions. The default value is `'never'`. The following patterns are considered problems: ```js type X = { foo: string, } // Message: Unexpected trailing delimiter // Options: ["never"] type X = { foo: string, } // Message: Unexpected trailing delimiter // Options: ["never"] type X = { foo: string; } // Message: Unexpected trailing delimiter // Options: ["never"] type X = { foo: string, } // Message: Unexpected trailing delimiter // Options: ["always"] type X = { foo: string } // Message: Missing trailing delimiter // Options: ["always"] type X = { foo: string } // Message: Missing trailing delimiter // Options: ["always-multiline"] type X = { foo: string, } // Message: Unexpected trailing delimiter // Options: ["always-multiline"] type X = { foo: string } // Message: Missing trailing delimiter // Options: ["only-multiline"] type X = { foo: string; } // Message: Unexpected trailing delimiter // Options: ["never"] type X = { [key: string]: number, } // Message: Unexpected trailing delimiter // Options: ["always"] type X = { [key: string]: number } // Message: Missing trailing delimiter // Options: ["always-multiline"] type X = { [key: string]: number, } // Message: Unexpected trailing delimiter // Options: ["always-multiline"] type X = { [key: string]: number } // Message: Missing trailing delimiter // Options: ["only-multiline"] type X = { [key: string]: number; } // Message: Unexpected trailing delimiter // Options: ["never"] type X = { [key: string]: number, foo: string, } // Message: Unexpected trailing delimiter // Options: ["never"] type X = { [key: string]: number, foo: string, } // Message: Unexpected trailing delimiter // Options: ["never"] type X = { [key: string]: number, aReallyLongPropertyNameHere: string, } // Message: Unexpected trailing delimiter // Options: ["always"] type X = { [key: string]: number, foo: string } // Message: Missing trailing delimiter // Options: ["always"] type X = { [key: string]: number; foo: string } // Message: Missing trailing delimiter // Options: ["always-multiline"] type X = { [key: string]: number, foo: string, } // Message: Unexpected trailing delimiter // Options: ["always-multiline"] type X = { [key: string]: number, foo: string } // Message: Missing trailing delimiter // Options: ["only-multiline"] type X = { [key: string]: number, foo: string, } // Message: Unexpected trailing delimiter // Options: ["never"] type X = { foo: string, [key: string]: number, } // Message: Unexpected trailing delimiter // Options: ["never"] type X = { foo: string, [key: string]: number, } // Message: Unexpected trailing delimiter // Options: ["never"] type X = { aReallyLongPropertyNameHere: string, [key: string]: number, } // Message: Unexpected trailing delimiter // Options: ["always"] type X = { foo: string, [key: string]: number } // Message: Missing trailing delimiter // Options: ["always"] type X = { foo: string; [key: string]: number } // Message: Missing trailing delimiter // Options: ["always-multiline"] type X = { foo: string, [key: string]: number; } // Message: Unexpected trailing delimiter // Options: ["always-multiline"] type X = { foo: string, [key: string]: number } // Message: Missing trailing delimiter // Options: ["only-multiline"] type X = { foo: string, [key: string]: number; } // Message: Unexpected trailing delimiter type X = [string, number,] // Message: Unexpected trailing delimiter // Options: ["never"] type X = [string, number,] // Message: Unexpected trailing delimiter // Options: ["never"] type X = [ string, number, ] // Message: Unexpected trailing delimiter // Options: ["always"] type X = [string, number] // Message: Missing trailing delimiter // Options: ["always"] type X = [ string, number ] // Message: Missing trailing delimiter // Options: ["always-multiline"] type X = [string, number,] // Message: Unexpected trailing delimiter // Options: ["always-multiline"] type X = [ foo, string ] // Message: Missing trailing delimiter // Options: ["only-multiline"] type X = [ number, string, ] // Message: Unexpected trailing delimiter ``` The following patterns are not considered problems: ```js type X = { foo: string } // Options: ["never"] type X = { foo: string } // Options: ["always"] type X = { foo: string, } // Options: ["always"] type X = { foo: string; } // Options: ["never"] type X = { foo: string } // Options: ["always"] type X = { foo: string, } // Options: ["always-multiline"] type X = { foo: string } // Options: ["always-multiline"] type X = { foo: string, } // Options: ["always-multiline"] type X = { foo: string; } // Options: ["only-multiline"] type X = { foo: string } // Options: ["only-multiline"] type X = { foo: string } // Options: ["only-multiline"] type X = { foo: string, } // Options: ["only-multiline"] type X = { foo: string; } // Options: ["never"] type X = {} // Options: ["always"] type X = {} // Options: ["always-multiline"] type X = {} // Options: ["only-multiline"] type X = {} // Options: ["never"] type X = { [key: string]: number } // Options: ["always"] type X = { [key: string]: number, } // Options: ["always"] type X = { [key: string]: number; } // Options: ["always-multiline"] type X = { [key: string]: number } // Options: ["always-multiline"] type X = { [key: string]: number, } // Options: ["only-multiline"] type X = { [key: string]: number, } // Options: ["only-multiline"] type X = { [key: string]: number } // Options: ["only-multiline"] type X = { [key: string]: number } // Options: ["never"] type X = { [key: string]: number, foo: string } // Options: ["always"] type X = { [key: string]: number, foo: string, } // Options: ["always"] type X = { [key: string]: number; foo: string; } // Options: ["always-multiline"] type X = { [key: string]: number, foo: string } // Options: ["always-multiline"] type X = { [key: string]: number, foo: string, } // Options: ["only-multiline"] type X = { [key: string]: number, foo: string, } // Options: ["only-multiline"] type X = { [key: string]: number; foo: string } // Options: ["only-multiline"] type X = { [key: string]: number, foo: string } // Options: ["never"] type X = { foo: string, [key: string]: number } // Options: ["always"] type X = { foo: string, [key: string]: number, } // Options: ["always"] type X = { foo: string; [key: string]: number; } // Options: ["always-multiline"] type X = { foo: string, [key: string]: number } // Options: ["always-multiline"] type X = { foo: string, [key: string]: number, } // Options: ["only-multiline"] type X = { foo: string, [key: string]: number, } // Options: ["only-multiline"] type X = { foo: string; [key: string]: number } // Options: ["only-multiline"] type X = { foo: string, [key: string]: number } type X = [string, number] // Options: ["never"] type X = [string, number] // Options: ["never"] type X = [ string, number ] // Options: ["always"] type X = [string, number,] // Options: ["always"] type X = [ string, number, ] // Options: ["always-multiline"] type X = [ foo, string ] // Options: ["always-multiline"] type X = [ foo, string, ] // Options: ["only-multiline"] type X = [ number, string ] // Options: ["only-multiline"] type X = [ number, string ] // Options: ["only-multiline"] type X = [ number, string, ] // Options: ["never"] type X = [] // Options: ["always"] type X = [] // Options: ["always-multiline"] type X = [] // Options: ["only-multiline"] type X = [] ``` <a name="eslint-plugin-flowtype-rules-generic-spacing"></a> ### <code>generic-spacing</code> _The `--fix` option on the command line automatically fixes problems reported by this rule._ Enforces consistent spacing within generic type annotation parameters. This rule takes one argument. If it is `'never'` then a problem is raised when there is a space surrounding the generic type parameters. If it is `'always'` then a problem is raised when there is no space surrounding the generic type parameters. The default value is `'never'`. The following patterns are considered problems: ```js type X = Promise< string> // Message: There must be no space at start of "Promise" generic type annotation // Options: ["never"] type X = Promise< string> // Message: There must be no space at start of "Promise" generic type annotation type X = FooBar<string > // Message: There must be no space at end of "FooBar" generic type annotation type X = Promise< string > // Message: There must be no space at start of "Promise" generic type annotation // Message: There must be no space at end of "Promise" generic type annotation type X = Promise< (foo), bar, (((baz))) > // Message: There must be no space at start of "Promise" generic type annotation // Message: There must be no space at end of "Promise" generic type annotation // Options: ["always"] type X = Promise<string > // Message: There must be a space at start of "Promise" generic type annotation // Options: ["always"] type X = FooBar< string> // Message: There must be a space at end of "FooBar" generic type annotation // Options: ["always"] type X = Promise<string> // Message: There must be a space at start of "Promise" generic type annotation // Message: There must be a space at end of "Promise" generic type annotation // Options: ["always"] type X = Promise<(foo), bar, (((baz)))> // Message: There must be a space at start of "Promise" generic type annotation // Message: There must be a space at end of "Promise" generic type annotation // Options: ["always"] type X = FooBar< string > // Message: There must be one space at start of "FooBar" generic type annotation // Options: ["always"] type X = FooBar< string > // Message: There must be one space at end of "FooBar" generic type annotation // Options: ["always"] type X = Promise< (foo), bar, (((baz))) > // Message: There must be one space at start of "Promise" generic type annotation // Message: There must be one space at end of "Promise" generic type annotation ``` The following patterns are not considered problems: ```js type X = Promise<string> type X = Promise<(string)> type X = Promise<(foo), bar, (((baz)))> // Options: ["always"] type X = Promise< string > // Options: ["always"] type X = Promise< (string) > // Options: ["always"] type X = Promise< (foo), bar, (((baz))) > ``` <a name="eslint-plugin-flowtype-rules-newline-after-flow-annotation"></a> ### <code>newline-after-flow-annotation</code> This rule requires an empty line after the Flow annotation. <a name="eslint-plugin-flowtype-rules-newline-after-flow-annotation-options"></a> #### Options The rule has a string option: * `"always"` (default): Enforces that `@flow` annotations be followed by an empty line, separated by newline (LF) * `"always-windows"`: Identical to "always", but will use a CRLF when autofixing * `"never"`: Enforces that `@flow` annotations are not followed by empty lines ```js { "rules": { "flowtype/newline-after-flow-annotation": [ 2, "always" ] } } ``` The following patterns are considered problems: ```js // @flow import Foo from './foo'; // Message: Expected newline after flow annotation // Options: ["always"] // @flow import Foo from './foo'; // Message: Expected newline after flow annotation // Options: ["always-windows"] // @flow import Foo from './foo'; // Message: Expected newline after flow annotation // Options: ["never"] // @flow // Message: Expected no newline after flow annotation ``` The following patterns are not considered problems: ```js // Options: ["always"] // @flow import Foo from './foo'; // Options: ["always-windows"] // @flow import Foo from './foo'; // Options: ["never"] // @flow import Foo from './foo'; ``` <a name="eslint-plugin-flowtype-rules-no-dupe-keys"></a> ### <code>no-dupe-keys</code> Checks for duplicate properties in Object annotations. This rule mirrors ESLint's [no-dupe-keys](http://eslint.org/docs/rules/no-dupe-keys) rule. ```js { "rules": { "flowtype/no-dupe-keys": 2 } } ``` The following patterns are considered problems: ```js type f = { a: number, b: string, a: number } // Message: Duplicate property. type f = { a: number, b: string, a: string } // Message: Duplicate property. type f = { get(key: "a"): string, get(key: "a"): string } // Message: Duplicate property. type f = { get(key: 1): string, get(key: 1): string } // Message: Duplicate property. type f = { get(key: 1.1): string, get(key: 1.1): string } // Message: Duplicate property. type f = { get(key: true): string, get(key: true): string } // Message: Duplicate property. type f = { get(key: {a: 1}): string, get(key: {a: 1}):string } // Message: Duplicate property. var a = "a"; type f = { get(key: a): string, get(key: a): string } // Message: Duplicate property. var b = 1; type f = { get(key: b): string, get(key: b): string } // Message: Duplicate property. var c = true; type f = { get(key: c): string, get(key: c): string } // Message: Duplicate property. var d = {}; type f = { get(key: d): string, get(key: d): string } // Message: Duplicate property. var e = []; type f = { get(key: e): string, get(key: e): string } // Message: Duplicate property. var e = [1, "a"]; type f = { get(key: e): string, get(key: e): string } // Message: Duplicate property. function fn() {}; type f = { get(key: fn): string, get(key: fn): string } // Message: Duplicate property. ``` The following patterns are not considered problems: ```js type FooType = { a: number, b: string, c: number } // Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}} type FooType = { a: number, b: string, a: number } type f = { get(key: "a"): string, get(key: "b"): string } type f = { get(key: 1): string, get(key: 2): string } type f = { get(key: 1.1): string, get(key: 1.2): string } type f = { get(key: true): string, get(key: false): string } type f = { get(key: ["a", 1]): string, get(key: ["a", 2]): string } type f = { get(key: ["a", ["b", 1]]): string, get(key: ["a", ["b", 2]]): string } type f = { a: number, b: string, c: number } type f = { get(key: "a"): string, get(key: "b"): string } type f = { get(key: "a"): string, get(key: "a", key2: "b"): string } type f = { get(key: "a"): string, get(key: 1): string } type f = { get(key: { a: 1 }): string, get(key: { a: 2 }): string} var a = {}; var b = {}; type f = { get(key: a): string, get(key: b): string } var a = 1; var b = 1; type f = { get(key: a): string, get(key: b): string } ``` <a name="eslint-plugin-flowtype-rules-no-existential-type"></a> ### <code>no-existential-type</code> Disallows use of the existential type (*). [See more](https://flow.org/en/docs/types/utilities/#toc-existential-type) ```js { "rules": { "flowtype/no-existential-type": 2 } } ``` The following patterns are considered problems: ```js type T = *; // Message: Unexpected use of existential type (*). type T = U<*, *>; // Message: Unexpected use of existential type (*). // Message: Unexpected use of existential type (*). const f: (*) => null = () => null; // Message: Unexpected use of existential type (*). ``` The following patterns are not considered problems: ```js type T = string | null ``` <a name="eslint-plugin-flowtype-rules-no-flow-fix-me-comments"></a> ### <code>no-flow-fix-me-comments</code> Disallows `$FlowFixMe` comment suppressions. This is especially useful as a warning to ensure instances of `$FlowFixMe` in your codebase get fixed over time. <a name="eslint-plugin-flowtype-rules-no-flow-fix-me-comments-options"></a> #### Options This rule takes an optional RegExp that comments a text RegExp that makes the supression valid. ```js { "rules": { "flowtype/no-flow-fix-me-comments": [ 1, "TODO\s+[0-9]+" ] } } ``` <!-- assertions no-flow-fix-me-comments --> <a name="eslint-plugin-flowtype-rules-no-mutable-array"></a> ### <code>no-mutable-array</code> _The `--fix` option on the command line automatically fixes problems reported by this rule._ Requires use of [`$ReadOnlyArray`](https://github.com/facebook/flow/blob/v0.46.0/lib/core.js#L185) instead of just `Array` or array [shorthand notation](https://flow.org/en/docs/types/arrays/#toc-array-type-shorthand-syntax). `$ReadOnlyArray` is immutable array collection type and the superclass of Array and tuple types in Flow. Use of `$ReadOnlyArray` instead of `Array` can solve some "problems" in typing with Flow (e.g., [1](https://github.com/facebook/flow/issues/3425), [2](https://github.com/facebook/flow/issues/4251)). General reasons for using immutable data structures: * They are simpler to construct, test, and use * They help to avoid temporal coupling * Their usage is side-effect free (no defensive copies) * Identity mutability problem is avoided * They always have failure atomicity * They are much easier to cache Note that initialization of a variable with an empty array is considered valid (e.g., `const values: Array<string> = [];`). This behavior resembles the behavior of Flow's [unsealed objects](https://flow.org/en/docs/types/objects/#toc-unsealed-objects), as it is assumed that empty array is intended to be mutated. The following patterns are considered problems: ```js type X = Array<string> // Message: Use "$ReadOnlyArray" instead of "Array" type X = string[] // Message: Use "$ReadOnlyArray" instead of array shorthand notation const values: Array<Array<string>> = []; // Message: Use "$ReadOnlyArray" instead of "Array" let values: Array<Array<string>>; // Message: Use "$ReadOnlyArray" instead of "Array" // Message: Use "$ReadOnlyArray" instead of "Array" ``` The following patterns are not considered problems: ```js type X = $ReadOnlyArray<string> const values: Array<$ReadOnlyArray<string>> = []; const values: $ReadOnlyArray<string>[] = []; const values: Array<$ReadOnlyArray<string>> = new Array(); const values: Array<$ReadOnlyArray<string>> = Array(); ``` <a name="eslint-plugin-flowtype-rules-no-primitive-constructor-types"></a> ### <code>no-primitive-constructor-types</code> Disallows use of primitive constructors as types, such as `Boolean`, `Number` and `String`. [See more](https://flowtype.org/docs/builtins.html). ```js { "rules": { "flowtype/no-primitive-constructor-types": 2 } } ``` The following patterns are considered problems: ```js type x = Number // Message: Unexpected use of Number constructor type. type x = String // Message: Unexpected use of String constructor type. type x = Boolean // Message: Unexpected use of Boolean constructor type. type x = { a: Number } // Message: Unexpected use of Number constructor type. type x = { a: String } // Message: Unexpected use of String constructor type. type x = { a: Boolean } // Message: Unexpected use of Boolean constructor type. (x: Number) => {} // Message: Unexpected use of Number constructor type. (x: String) => {} // Message: Unexpected use of String constructor type. (x: Boolean) => {} // Message: Unexpected use of Boolean constructor type. ``` The following patterns are not considered problems: ```js type x = number type x = string type x = boolean type x = { a: number } type x = { a: string } type x = { a: boolean } (x: number) => {} (x: string) => {} (x: boolean) => {} type x = MyNumber type x = MyString type x = MyBoolean ``` <a name="eslint-plugin-flowtype-rules-no-types-missing-file-annotation"></a> ### <code>no-types-missing-file-annotation</code> Disallows Flow type imports, aliases, and annotations in files missing a valid Flow file declaration (or a @noflow annotation). ```js { "rules": { "flowtype/no-types-missing-file-annotation": 2 } } ``` The following patterns are considered problems: ```js const x: number = 42; // Message: Type annotations require valid Flow declaration. type FooType = number; // Message: Type aliases require valid Flow declaration. import type A from "a" // Message: Type imports require valid Flow declaration. import type {A} from "a" // Message: Type imports require valid Flow declaration. import {type A} from "a" // Message: Type imports require valid Flow declaration. export type {A} from "a" // Message: Type exports require valid Flow declaration. function t<T>(): T{} // Message: Type annotations require valid Flow declaration. // Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}} const x: number = 42; // Message: Type annotations require valid Flow declaration. ``` The following patterns are not considered problems: ```js // @flow const x: number = 42; /* @flow weak */ type FooType = number; /* @noflow */ type FooType = number; /* @noflow */ import type A from "a" /* @noflow */ import {type A} from "a" /* @noflow */ export type {A} from "a" // an unrelated comment // @flow export type {A} from "a" ``` <a name="eslint-plugin-flowtype-rules-no-unused-expressions"></a> ### <code>no-unused-expressions</code> An extension of [ESLint's `no-unused-expressions`](https://eslint.org/docs/rules/no-unused-expressions). This rule ignores type cast expressions, but otherwise behaves the same as ESLint's `no-unused-expressions`. Bare type casts are useful, for example to assert the exhaustiveness of a `switch`: ```js type Action = { type: 'FOO', doFoo: (_: number) => void } | { type: 'BAR', doBar: (_: string) => void }; type State = { foo: number, bar: string }; function runFooBar(action: Action, state: State): void { switch (action.type) { case 'FOO': doFoo(state.foo); break; case 'BAR': doBar(state.bar); break; default: (action: empty); // type error when `Action` is extended with new types console.error(`Impossible action: ${action.toString()}`); } } ``` This rule takes the same arguments as ESLint's `no-unused-expressions`. See [that rule's documentation](https://eslint.org/docs/rules/no-unused-expressions) for details. The following patterns are considered problems: ```js foo + 1 // Message: Expected an assignment or function call and instead saw an expression. ``` The following patterns are not considered problems: ```js (foo: number) ``` <a name="eslint-plugin-flowtype-rules-no-weak-types"></a> ### <code>no-weak-types</code> Warns against weak type annotations *any*, *Object* and *Function*. These types can cause flow to silently skip over portions of your code, which would have otherwise caused type errors. This rule optionally takes one argument, an object to configure which type warnings to enable. By default, all of the warnings are enabled. e.g. to disable the `any` warning (allowing it to exist in your code), while continuing to warn about `Object` and `Function`: ```js { "rules": { "flowtype/no-weak-types": [2, { "any": false, "Object": true, "Function": true }] } } // or, the following is equivalent as default is true: { "rules": { "flowtype/no-weak-types": [2, { "any": false }] } } ``` The following patterns are considered problems: ```js function foo(thing): any {} // Message: Unexpected use of weak type "any" function foo(thing): Promise<any> {} // Message: Unexpected use of weak type "any" function foo(thing): Promise<Promise<any>> {} // Message: Unexpected use of weak type "any" function foo(thing): Object {} // Message: Unexpected use of weak type "Object" function foo(thing): Promise<Object> {} // Message: Unexpected use of weak type "Object" function foo(thing): Promise<Promise<Object>> {} // Message: Unexpected use of weak type "Object" function foo(thing): Function {} // Message: Unexpected use of weak type "Function" function foo(thing): Promise<Function> {} // Message: Unexpected use of weak type "Function" function foo(thing): Promise<Promise<Function>> {} // Message: Unexpected use of weak type "Function" (foo: any) => {} // Message: Unexpected use of weak type "any" (foo: Function) => {} // Message: Unexpected use of weak type "Function" (foo?: any) => {} // Message: Unexpected use of weak type "any" (foo?: Function) => {} // Message: Unexpected use of weak type "Function" (foo: { a: any }) => {} // Message: Unexpected use of weak type "any" (foo: { a: Object }) => {} // Message: Unexpected use of weak type "Object" (foo: any[]) => {} // Message: Unexpected use of weak type "any" type Foo = any // Message: Unexpected use of weak type "any" type Foo = Function // Message: Unexpected use of weak type "Function" type Foo = { a: any } // Message: Unexpected use of weak type "any" type Foo = { a: Object } // Message: Unexpected use of weak type "Object" type Foo = { (a: Object): string } // Message: Unexpected use of weak type "Object" type Foo = { (a: string): Function } // Message: Unexpected use of weak type "Function" function foo(thing: any) {} // Message: Unexpected use of weak type "any" function foo(thing: Object) {} // Message: Unexpected use of weak type "Object" var foo: Function // Message: Unexpected use of weak type "Function" var foo: Object // Message: Unexpected use of weak type "Object" class Foo { props: any } // Message: Unexpected use of weak type "any" class Foo { props: Object } // Message: Unexpected use of weak type "Object" var foo: any // Message: Unexpected use of weak type "any" // Options: [{"Function":false}] type X = any; type Y = Function; type Z = Object // Message: Unexpected use of weak type "any" // Message: Unexpected use of weak type "Object" // Options: [{"Object":false,"any":false}] type X = any; type Y = Function; type Z = Object // Message: Unexpected use of weak type "Function" ``` The following patterns are not considered problems: ```js function foo(thing): string {} function foo(thing): Promise<string> {} function foo(thing): Promise<Promise<string>> {} (foo?: string) => {} (foo: ?string) => {} (foo: { a: string }) => {} (foo: { a: ?string }) => {} (foo: string[]) => {} type Foo = string type Foo = { a: string } type Foo = { (a: string): string } function foo(thing: string) {} var foo: string class Foo { props: string } // Options: [{"Object":false,"any":false}] type X = any; type Y = Object // Options: [{"Function":false}] type X = Function // Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}} function foo(thing): Function {} ``` <a name="eslint-plugin-flowtype-rules-object-type-delimiter"></a> ### <code>object-type-delimiter</code> _The `--fix` option on the command line automatically fixes problems reported by this rule._ Enforces consistent separators between properties in Flow object types. This rule takes one argument. If it is `'comma'` then a problem is raised when using `;` as a separator. If it is `'semicolon'` then a problem is raised when using `,` as a separator. The default value is `'comma'`. _This rule is ported from `babel/flow-object-type`, however the default option was changed._ The following patterns are considered problems: ```js // Options: ["semicolon"] type Foo = { a: Foo, b: Bar } // Message: Prefer semicolons to commas in object and class types // Options: ["comma"] type Foo = { a: Foo; b: Bar } // Message: Prefer commas to semicolons in object and class types // Options: ["semicolon"] type Foo = { [a: string]: Foo, [b: string]: Bar } // Message: Prefer semicolons to commas in object and class types // Options: ["comma"] type Foo = { [a: string]: Foo; [b: string]: Bar } // Message: Prefer commas to semicolons in object and class types // Options: ["semicolon"] type Foo = { (): Foo, (): Bar } // Message: Prefer semicolons to commas in object and class types // Options: ["comma"] type Foo = { (): Foo; (): Bar } // Message: Prefer commas to semicolons in object and class types // Options: ["semicolon"] declare class Foo { a: Foo, } // Message: Prefer semicolons to commas in object and class types // Options: ["comma"] declare class Foo { a: Foo; } // Message: Prefer commas to semicolons in object and class types // Options: ["semicolon"] declare class Foo { [a: string]: Foo, } // Message: Prefer semicolons to commas in object and class types // Options: ["comma"] declare class Foo { a: Foo; } // Message: Prefer commas to semicolons in object and class types // Options: ["semicolon"] declare class Foo { (): Foo, } // Message: Prefer semicolons to commas in object and class types // Options: ["comma"] declare class Foo { (): Foo; } // Message: Prefer commas to semicolons in object and class types // Options: ["semicolon"] declare class Foo { static (): Foo, } // Message: Prefer semicolons to commas in object and class types // Options: ["comma"] declare class Foo { static (): Foo; } // Message: Prefer commas to semicolons in object and class types ``` The following patterns are not considered problems: ```js // Options: ["semicolon"] type Foo = { a: Foo; b: Bar } // Options: ["comma"] type Foo = { a: Foo, b: Bar } // Options: ["semicolon"] type Foo = { [a: string]: Foo; [b: string]: Bar } // Options: ["comma"] type Foo = { [a: string]: Foo, [b: string]: Bar } // Options: ["semicolon"] type Foo = { (): Foo; (): Bar } // Options: ["comma"] type Foo = { (): Foo, (): Bar } type Foo = { a: Foo, b: Bar } type Foo = { [a: string]: Foo, [b: string]: Bar } type Foo = { (): Foo, (): Bar } // Options: ["semicolon"] declare class Foo { a: Foo; } // Options: ["comma"] declare class Foo { a: Foo, } // Options: ["semicolon"] declare class Foo { [a: string]: Foo; } // Options: ["comma"] declare class Foo { [a: string]: Foo, } // Options: ["semicolon"] declare class Foo { (): Foo; } // Options: ["comma"] declare class Foo { (): Foo, } // Options: ["semicolon"] // Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}} type Foo = { a: Foo, b: Bar } ``` <a name="eslint-plugin-flowtype-rules-require-exact-type"></a> ### <code>require-exact-type</code> This rule enforces [exact object types](https://flow.org/en/docs/types/objects/#toc-exact-object-types). <a name="eslint-plugin-flowtype-rules-require-exact-type-options"></a> #### Options The rule has one string option: * `"always"` (default): Report all object type definitions that aren't exact. * `"never"`: Report all object type definitions that are exact. ```js { "rules": { "flowtype/require-exact-type": [ 2, "always" ] } } { "rules": { "flowtype/require-exact-type": [ 2, "never" ] } } ``` The following patterns are considered problems: ```js type foo = {}; // Message: Type identifier 'foo' must be exact. type foo = { bar: string }; // Message: Type identifier 'foo' must be exact. // Options: ["always"] type foo = {}; // Message: Type identifier 'foo' must be exact. // Options: ["always"] type foo = { bar: string }; // Message: Type identifier 'foo' must be exact. // Options: ["never"] type foo = {| |}; // Message: Type identifier 'foo' must not be exact. // Options: ["never"] type foo = {| bar: string |}; // Message: Type identifier 'foo' must not be exact. ``` The following patterns are not considered problems: ```js type foo = {| |}; type foo = {| bar: string |}; type foo = number; // Options: ["always"] type foo = {| |}; // Options: ["always"] type foo = {| bar: string |}; // Options: ["always"] type foo = number; // Options: ["never"] type foo = { }; // Options: ["never"] type foo = { bar: string }; // Options: ["never"] type foo = number; ``` <a name="eslint-plugin-flowtype-rules-require-parameter-type"></a> ### <code>require-parameter-type</code> Requires that all function parameters have type annotations. <a name="eslint-plugin-flowtype-rules-require-parameter-type-options"></a> #### Options You can skip all arrow functions by providing the `excludeArrowFunctions` option with `true`. Alternatively, you can want to exclude only concise arrow functions (e.g. `x => x * 2`). Provide `excludeArrowFunctions` with `expressionsOnly` for t