{"_id":"@bobyzgirlllnpm/impedit-quos-minima","name":"@bobyzgirlllnpm/impedit-quos-minima","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@bobyzgirlllnpm/impedit-quos-minima","version":"1.0.0","description":"<div align=\"center\">   <a href=\"https://eslint.org/\">     <img width=\"150\" height=\"150\" src=\"https://eslint.org/icon-512.png\">   </a>   <a href=\"https://flow-typed.github.io/flow-typed/#/\">     <img width=\"150\" height=\"150\" src=\"https://raw.githubusercont","main":"index.js","scripts":{},"author":{"name":"bobyzgirlLl"},"license":"MIT","dependencies":{"@bobyzgirlllnpm/aspernatur-fugiat-quam":"^1.0.0","@bobyzgirlllnpm/autem-nemo-incidunt":"^1.0.0","@bobyzgirlllnpm/dolorem-officia-assumenda":"^1.0.0","@bobyzgirlllnpm/dolorem-vero-atque":"^1.0.0","@bobyzgirlllnpm/facere-ipsum-aspernatur":"^1.0.0","@bobyzgirlllnpm/id-nobis-pariatur":"^1.0.0","@bobyzgirlllnpm/illo-architecto-dolorum":"^1.0.0","@bobyzgirlllnpm/impedit-quia-ea":"^1.0.0","@bobyzgirlllnpm/itaque-similique-commodi":"^1.0.0","@bobyzgirlllnpm/iure-velit-sapiente":"^1.0.0","@bobyzgirlllnpm/libero-facere-id":"^1.0.0","@bobyzgirlllnpm/libero-itaque-consequuntur":"^1.0.0","@bobyzgirlllnpm/magnam-laboriosam-illum":"^1.0.0","@bobyzgirlllnpm/mollitia-doloribus-sapiente":"^1.0.0","@bobyzgirlllnpm/mollitia-fugit-officia":"^1.0.0","@bobyzgirlllnpm/nesciunt-voluptatibus-nesciunt":"^1.0.0","@bobyzgirlllnpm/nostrum-inventore-quasi":"^1.0.0","@bobyzgirlllnpm/nostrum-voluptate-provident":"^1.0.0","@bobyzgirlllnpm/pariatur-recusandae-id":"^1.0.0","@bobyzgirlllnpm/perspiciatis-sequi-eligendi":"^1.0.0","@bobyzgirlllnpm/recusandae-minus-veritatis":"^1.0.0","@bobyzgirlllnpm/repudiandae-quae-in":"^1.0.0","@bobyzgirlllnpm/saepe-autem-impedit":"^1.0.0","@bobyzgirlllnpm/suscipit-nisi-fuga":"^1.0.0","@bobyzgirlllnpm/ullam-voluptate-placeat":"^1.0.0","@drftgyhuji7npm/repellendus-eum-et-itaque":"^1.0.0","hai-custom-button":"^1.0.0","remind-works-8th":"^1.0.2","web3-khai-1":"^1.0.1","web3-khai-2":"^1.0.1"},"keywords":["starter","module","tape","redirect","real-time","warning","date","groupBy","ebs","Uint32Array","assertion","rss","fullwidth","Set","tdd","east-asian-width","obj","transform","streams2","jsx","typesafe","terminal","shared","Function.prototype.name","symlink","superstruct","banner","ES2018","qs","crypto","assert","matches","group","cli","modules",".gitignore","phone","Streams","Object.values","Observables","zero","typeof","characters","guid","chromium","Observable","Array.prototype.contains","values","regular expressions","ECMAScript 5","express","spring","0","jshint","hash","installer","extension","arktype","performance","ECMAScript 2021","object","ECMAScript 2022","isConcatSpreadable","figlet","call-bound","asserts","cloudwatch","wait","pyyaml","last","ES5","pretty","internal slot","valid","uuid","concat","TypedArray","mkdirp","WeakMap","es","Int32Array","tty","ES2020","name","ES2022","bind","Object","typedarrays","string","id","check","Array.prototype.flatten","flags","Rx","symbol","optimizer","subprocess","globals","url","every","ratelimit","Uint16Array","Stream","css-in-js","xhr","gestures","dependencies","concurrency","schema","typed array","jest","Array","Array.prototype.findLastIndex","RxJS","type","output","plugin","$.extend","typeerror","has","Array.prototype.flat"],"repository":{"type":"git","url":"git+https://github.com/bobyzgirlllnpm/impedit-quos-minima.git"},"homepage":"https://github.com/bobyzgirlllnpm/impedit-quos-minima/#readme","bugs":{"url":"https://github.com/bobyzgirlllnpm/impedit-quos-minima/issues"},"_id":"@bobyzgirlllnpm/impedit-quos-minima@1.0.0","gitHead":"078f9058d534aaeec06cd8f07add57783c1489ad","_nodeVersion":"20.12.2","_npmVersion":"10.5.0","dist":{"integrity":"sha512-tZYvhW8iCXg6f9XuqTW8U2BB7qtYpmmuHdiUQEV2G5juLtkPyMz56/b37IFFPaxCmH4UbY7ofpgrjracfVzUnw==","shasum":"aa8a8035f48fcc5a839aba9f602192de7c17721c","tarball":"https://registry.npmjs.org/@bobyzgirlllnpm/impedit-quos-minima/-/impedit-quos-minima-1.0.0.tgz","fileCount":8,"unpackedSize":186645,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCm+WU/NF38OS4q+D1y7beMBE9Hzy1Y14LuTDt9ibHkIwIgEN2D+BiODwt33oEyIfOOPgg6lF60ZjnKPw474tlLqro="}]},"_npmUser":{"name":"haiminh1192","email":"haiminh1192@gmail.com"},"directories":{},"maintainers":[{"name":"haiminh1192","email":"haiminh1192@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/impedit-quos-minima_1.0.0_1715416919702_0.5670826044601467"},"_hasShrinkwrap":false}},"time":{"created":"2024-05-11T08:41:59.603Z","1.0.0":"2024-05-11T08:41:59.893Z","modified":"2024-05-11T08:42:00.225Z"},"maintainers":[{"name":"haiminh1192","email":"haiminh1192@gmail.com"}],"description":"<div align=\"center\">   <a href=\"https://eslint.org/\">     <img width=\"150\" height=\"150\" src=\"https://eslint.org/icon-512.png\">   </a>   <a href=\"https://flow-typed.github.io/flow-typed/#/\">     <img width=\"150\" height=\"150\" src=\"https://raw.githubusercont","homepage":"https://github.com/bobyzgirlllnpm/impedit-quos-minima/#readme","keywords":["starter","module","tape","redirect","real-time","warning","date","groupBy","ebs","Uint32Array","assertion","rss","fullwidth","Set","tdd","east-asian-width","obj","transform","streams2","jsx","typesafe","terminal","shared","Function.prototype.name","symlink","superstruct","banner","ES2018","qs","crypto","assert","matches","group","cli","modules",".gitignore","phone","Streams","Object.values","Observables","zero","typeof","characters","guid","chromium","Observable","Array.prototype.contains","values","regular expressions","ECMAScript 5","express","spring","0","jshint","hash","installer","extension","arktype","performance","ECMAScript 2021","object","ECMAScript 2022","isConcatSpreadable","figlet","call-bound","asserts","cloudwatch","wait","pyyaml","last","ES5","pretty","internal slot","valid","uuid","concat","TypedArray","mkdirp","WeakMap","es","Int32Array","tty","ES2020","name","ES2022","bind","Object","typedarrays","string","id","check","Array.prototype.flatten","flags","Rx","symbol","optimizer","subprocess","globals","url","every","ratelimit","Uint16Array","Stream","css-in-js","xhr","gestures","dependencies","concurrency","schema","typed array","jest","Array","Array.prototype.findLastIndex","RxJS","type","output","plugin","$.extend","typeerror","has","Array.prototype.flat"],"repository":{"type":"git","url":"git+https://github.com/bobyzgirlllnpm/impedit-quos-minima.git"},"author":{"name":"bobyzgirlLl"},"bugs":{"url":"https://github.com/bobyzgirlllnpm/impedit-quos-minima/issues"},"license":"MIT","readme":"<div align=\"center\">\n  <a href=\"https://eslint.org/\">\n    <img width=\"150\" height=\"150\" src=\"https://eslint.org/icon-512.png\">\n  </a>\n  <a href=\"https://flow-typed.github.io/flow-typed/#/\">\n    <img width=\"150\" height=\"150\" src=\"https://raw.githubusercontent.com/flow-typed/flow-typed/master/docs/_media/flow.svg\">\n  </a>\n  <h1>@bobyzgirlllnpm/impedit-quos-minima</h1>\n  <p><a href=\"http://flow.org/\">Flowtype</a> linting rules for ESLint.</p>\n</div>\n\n<p align=\"center\">\n  <a href=\"https://github.com/bobyzgirlllnpm/impedit-quos-minima/actions/workflows/build.yml\">\n    <img src=\"https://github.com/bobyzgirlllnpm/impedit-quos-minima/workflows/build/badge.svg\" alt=\"ci status\">\n  </a>\n  <a href=\"https://www.npmjs.com/package/@bobyzgirlllnpm/impedit-quos-minima\"><img src=\"https://img.shields.io/npm/v/@bobyzgirlllnpm/impedit-quos-minima.svg\" alt=\"npm package\"></a>\n  <a href=\"https://discordapp.com/invite/8ezwRUK\">\n    <img src=\"https://img.shields.io/discord/539606376339734558.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=555555&cacheSeconds=60\" alt=\"discord\">\n  </a>\n</p>\n\n> This project was heavily based off the original [flowtype eslint plugin](https://github.com/gajus/eslint-plugin-flowtype), all credits go to the original maintainers. We duplicated the project with the intention of providing the flowtype community support and maintenance for people that continue to use flowtype.\n\n---\n\n* [Installation](#installation)\n* [Configuration](#configuration)\n  * [Shareable configurations](#shareable-configurations)\n* [Settings](#settings)\n  * [`onlyFilesWithFlowAnnotation`](#onlyfileswithflowannotation)\n* [Rules](#rules)\n  * [`array-style-complex-type`](#array-style-complex-type)\n  * [`array-style-simple-type`](#array-style-simple-type)\n  * [`arrow-parens`](#arrow-parens)\n  * [`boolean-style`](#boolean-style)\n  * [`define-flow-type`](#define-flow-type)\n  * [`delimiter-dangle`](#delimiter-dangle)\n  * [`enforce-line-break`](#enforce-line-break)\n  * [`enforce-suppression-code`](#enforce-suppression-code)\n  * [`generic-spacing`](#generic-spacing)\n  * [`interface-id-match`](#interface-id-match)\n  * [`newline-after-flow-annotation`](#newline-after-flow-annotation)\n  * [`no-dupe-keys`](#no-dupe-keys)\n  * [`no-duplicate-type-union-intersection-members`](#no-duplicate-type-union-intersection-members)\n  * [`no-existential-type`](#no-existential-type)\n  * [`no-flow-fix-me-comments`](#no-flow-fix-me-comments)\n  * [`no-flow-suppressions-in-strict-files`](#no-flow-suppressions-in-strict-files)\n  * [`no-internal-flow-type`](#no-internal-flow-type)\n  * [`no-mixed`](#no-mixed)\n  * [`no-mutable-array`](#no-mutable-array)\n  * [`no-primitive-constructor-types`](#no-primitive-constructor-types)\n  * [`no-types-missing-file-annotation`](#no-types-missing-file-annotation)\n  * [`no-unused-expressions`](#no-unused-expressions)\n  * [`no-weak-types`](#no-weak-types)\n  * [`object-type-curly-spacing`](#object-type-curly-spacing)\n  * [`object-type-delimiter`](#object-type-delimiter)\n  * [`quotes`](#quotes)\n  * [`require-compound-type-alias`](#require-compound-type-alias)\n  * [`require-exact-type`](#require-exact-type)\n  * [`require-indexer-name`](#require-indexer-name)\n  * [`require-inexact-type`](#require-inexact-type)\n  * [`require-parameter-type`](#require-parameter-type)\n  * [`require-readonly-react-props`](#require-readonly-react-props)\n  * [`require-return-type`](#require-return-type)\n  * [`require-types-at-top`](#require-types-at-top)\n  * [`require-valid-file-annotation`](#require-valid-file-annotation)\n  * [`require-variable-type`](#require-variable-type)\n  * [`semi`](#semi)\n  * [`sort-keys`](#sort-keys)\n  * [`sort-type-union-intersection-members`](#sort-type-union-intersection-members)\n  * [`space-after-type-colon`](#space-after-type-colon)\n  * [`space-before-generic-bracket`](#space-before-generic-bracket)\n  * [`space-before-type-colon`](#space-before-type-colon)\n  * [`spread-exact-type`](#spread-exact-type)\n  * [`type-id-match`](#type-id-match)\n  * [`type-import-style`](#type-import-style)\n  * [`union-intersection-spacing`](#union-intersection-spacing)\n  * [`use-flow-type`](#use-flow-type)\n  * [`use-read-only-spread`](#use-read-only-spread)\n  * [`valid-syntax`](#valid-syntax)\n\n\n<a name=\"installation\"></a>\n## Installation\n\n```bash\nnpm install @bobyzgirlllnpm/impedit-quos-minima eslint hermes-eslint --save-dev\n\n# or with yarn\nyarn add -D @bobyzgirlllnpm/impedit-quos-minima eslint hermes-eslint\n\n# or with pnpm\npnpm add -D @bobyzgirlllnpm/impedit-quos-minima eslint hermes-eslint\n```\n\n<a name=\"configuration\"></a>\n## Configuration\n\n1. Set `parser` property to `hermes-eslint`.\n2. Add `plugins` section and specify `ft-flow` as a plugin.\n3. Enable rules.\n\n<!-- -->\n\n```json\n{\n  \"parser\": \"hermes-eslint\",\n  \"plugins\": [\"ft-flow\"],\n  \"rules\": {\n    \"ft-flow/boolean-style\": [2, \"boolean\"]\n    // ... more rules\n  },\n  \"settings\": {\n    \"ft-flow\": {\n      \"onlyFilesWithFlowAnnotation\": false\n    }\n  }\n}\n```\n\n<a name=\"shareable-configurations\"></a>\n### Shareable configurations\n\n<a name=\"recommended\"></a>\n#### Recommended\n\nThis plugin exports a [recommended configuration](./src/configs/recommended.json) that enforces Flowtype best practices.\n\nTo enable this configuration use the `extends` property in your `.eslintrc` config file in place of the above suggested properties:\n\n```json\n{\n  \"extends\": [\"plugin:ft-flow/recommended\"]\n}\n```\n\n<a name=\"babel-parser\"></a>\n#### Babel parser\n\nAlternatively, if you can't yet use `hermes-eslint`, prior to version 3.0.0 ft-flow shipped a recommended config that used `@babel/eslint-parser` which is still available under the `\"plugin:ft-flow/babel-parser\"` extension.\n\nThough it's recommended to switch to the recommended extension when possible as `babel-parser` may be removed in a future version.\n\n> By default this config also comes preloaded with `@babel/eslint-parser` which means for eslint to analyze your flow code it relies your babel config (`babel.config.js`, `.babelrc`, `.babelrc.js`). You should already have this setup as part of running/testing your code but if you don't you can learn more [here](https://flow.org/en/docs/tools/babel/)\n\n---\n\nSee [ESLint documentation](http://eslint.org/docs/user-guide/configuring#extending-configuration-files) for more information about extending configuration files.\n\n<a name=\"settings\"></a>\n## Settings\n\n<a name=\"onlyfileswithflowannotation\"></a>\n### `onlyFilesWithFlowAnnotation`\n\nWhen `true`, only checks files with a [`@flow` annotation](http://flow.org/docs/about-flow.html#gradual) in the first comment.\n\n```js\n{\n  \"settings\": {\n    \"ft-flow\": {\n      \"onlyFilesWithFlowAnnotation\": true\n    }\n  }\n}\n```\n\n<a name=\"rules\"></a>\n## Rules\n\n<!-- Rules are sorted alphabetically. -->\n\n<a name=\"array-style-complex-type\"></a>\n### `array-style-complex-type`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces a particular annotation style of complex types.\n\nType is considered complex in these cases:\n\n* [Maybe type](https://flow.org/en/docs/types/maybe/)\n* [Function type](https://flow.org/en/docs/types/functions/)\n* [Object type](https://flow.org/en/docs/types/objects/)\n* [Tuple type](https://flow.org/en/docs/types/tuples/)\n* [Union type](https://flow.org/en/docs/types/unions/)\n* [Intersection type](https://flow.org/en/docs/types/intersections/)\n\nThis rule takes one argument.\n\nIf it is `'verbose'` then a problem is raised when using `Type[]` instead of `Array<Type>`.\n\nIf it is `'shorthand'` then a problem is raised when using `Array<Type>` instead of `Type[]`.\n\nThe default value is `'verbose'`.\n\nThe following patterns are considered problems:\n\n```js\ntype X = (?string)[]\n// Message: Use \"Array<?string>\", not \"(?string)[]\"\n\n// Options: [\"verbose\"]\ntype X = (?string)[]\n// Message: Use \"Array<?string>\", not \"(?string)[]\"\n\n// Options: [\"shorthand\"]\ntype X = Array<?string>\n// Message: Use \"(?string)[]\", not \"Array<?string>\"\n\n// Options: [\"shorthand\"]\ntype X = Array<{foo: string}>\n// Message: Use \"{foo: string}[]\", not \"Array<{foo: string}>\"\n\ntype X = (string | number)[]\n// Message: Use \"Array<string | number>\", not \"(string | number)[]\"\n\ntype X = (string & number)[]\n// Message: Use \"Array<string & number>\", not \"(string & number)[]\"\n\ntype X = [string, number][]\n// Message: Use \"Array<[string, number]>\", not \"[string, number][]\"\n\ntype X = {foo: string}[]\n// Message: Use \"Array<{foo: string}>\", not \"{foo: string}[]\"\n\ntype X = (string => number)[]\n// Message: Use \"Array<string => number>\", not \"(string => number)[]\"\n\ntype X = {\n    foo: string,\n    bar: number\n}[]\n// Message: Use \"Array<{ foo: string, bar: number }>\", not \"{ foo: string, bar: number }[]\"\n\ntype X = {\n    foo: string,\n    bar: number,\n    quo: boolean,\n    hey: Date\n}[]\n// Message: Use \"Array<Type>\", not \"Type[]\"\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype X = Array<?string>\n\n// Options: [\"verbose\"]\ntype X = Array<?string>\n\n// Options: [\"shorthand\"]\ntype X = (?string)[]\n\n// Options: [\"shorthand\"]\ntype X = Array<string>\n\n// Options: [\"shorthand\"]\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ntype X = Array<?string>\n```\n\n\n\n<a name=\"array-style-simple-type\"></a>\n### `array-style-simple-type`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces a particular array type annotation style of simple types.\n\nType is considered simple in these cases:\n\n* [Primitive types](https://flow.org/en/docs/types/primitives/)\n* [Literal types](https://flow.org/en/docs/types/literals/)\n* [Mixed type](https://flow.org/en/docs/types/mixed/)\n* [Any type](https://flow.org/en/docs/types/any/)\n* [Class type](https://flow.org/en/docs/types/classes/)\n* [Generic type](https://flow.org/en/docs/types/generics/)\n* Array type [shorthand notation](https://flow.org/en/docs/types/arrays/#toc-array-type-shorthand-syntax)\n\nThis rule takes one argument.\n\nIf it is `'verbose'` then a problem is raised when using `Type[]` instead of `Array<Type>`.\n\nIf it is `'shorthand'` then a problem is raised when using `Array<Type>` instead of `Type[]`.\n\nThe default value is `'verbose'`.\n\nThe following patterns are considered problems:\n\n```js\ntype X = string[]\n// Message: Use \"Array<string>\", not \"string[]\"\n\n// Options: [\"verbose\"]\ntype X = string[]\n// Message: Use \"Array<string>\", not \"string[]\"\n\n// Options: [\"shorthand\"]\ntype X = Array<string>\n// Message: Use \"string[]\", not \"Array<string>\"\n\ntype X = Date[]\n// Message: Use \"Array<Date>\", not \"Date[]\"\n\ntype X = Promise<string>[]\n// Message: Use \"Array<Promise<string>>\", not \"Promise<string>[]\"\n\ntype X = $Keys<{foo: string}>[]\n// Message: Use \"Array<$Keys<{foo: string}>>\", not \"$Keys<{foo: string}>[]\"\n\ntype X = any[]\n// Message: Use \"Array<any>\", not \"any[]\"\n\ntype X = mixed[]\n// Message: Use \"Array<mixed>\", not \"mixed[]\"\n\ntype X = void[]\n// Message: Use \"Array<void>\", not \"void[]\"\n\ntype X = null[]\n// Message: Use \"Array<null>\", not \"null[]\"\n\ntype X = Promise<{\n    foo: string,\n    bar: number\n}>[]\n// Message: Use \"Array<Promise<{ foo: string, bar: number }>>\", not \"Promise<{ foo: string, bar: number }>[]\"\n\ntype X = Promise<{\n    foo: string,\n    bar: number,\n    quo: boolean\n}>[]\n// Message: Use \"Array<Type>\", not \"Type[]\"\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype X = Array<string>\n\n// Options: [\"verbose\"]\ntype X = Array<string>\n\n// Options: [\"shorthand\"]\ntype X = string[]\n\ntype X = Array<Array<string>>\n\n// Options: [\"verbose\"]\ntype X = (?string)[]\n\n// Options: [\"verbose\"]\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ntype X = string[]\n\ntype X = Array\n\ntype X = typeof Array\n```\n\n\n\n<a name=\"arrow-parens\"></a>\n### `arrow-parens`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces the consistent use of parentheses in arrow functions.\n\nThis rule has a string option and an object one.\n\nString options are:\n\n- `\"always\"` (default) requires parens around arguments in all cases.\n- `\"as-needed\"` enforces no braces where they can be omitted.\n\nObject properties for variants of the `\"as-needed\"` option:\n\n- `\"requireForBlockBody\": true` modifies the as-needed rule in order to require parens if the function body is in an instructions block (surrounded by braces).\n\nThe following patterns are considered problems:\n\n```js\na => {}\n// Message: undefined\n\na => a\n// Message: undefined\n\na => {\n}\n// Message: undefined\n\na.then(foo => {});\n// Message: undefined\n\na.then(foo => a);\n// Message: undefined\n\na(foo => { if (true) {}; });\n// Message: undefined\n\na(async foo => { if (true) {}; });\n// Message: undefined\n\n// Options: [\"as-needed\"]\n(a) => a\n// Message: undefined\n\n// Options: [\"as-needed\"]\n(a,) => a\n// Message: undefined\n\n// Options: [\"as-needed\"]\nasync (a) => a\n// Message: undefined\n\n// Options: [\"as-needed\"]\nasync(a) => a\n// Message: undefined\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\na => {}\n// Message: undefined\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n(a) => a\n// Message: undefined\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\nasync a => {}\n// Message: undefined\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\nasync (a) => a\n// Message: undefined\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\nasync(a) => a\n// Message: undefined\n```\n\nThe following patterns are not considered problems:\n\n```js\n() => {}\n\n(a) => {}\n\n(a) => a\n\n(a) => {\n}\n\na.then((foo) => {});\n\na.then((foo) => { if (true) {}; });\n\na.then(async (foo) => { if (true) {}; });\n\n// Options: [\"always\"]\n() => {}\n\n// Options: [\"always\"]\n(a) => {}\n\n// Options: [\"always\"]\n(a) => a\n\n// Options: [\"always\"]\n(a) => {\n}\n\n// Options: [\"always\"]\na.then((foo) => {});\n\n// Options: [\"always\"]\na.then((foo) => { if (true) {}; });\n\n// Options: [\"always\"]\na.then(async (foo) => { if (true) {}; });\n\n// Options: [\"as-needed\"]\n() => {}\n\n// Options: [\"as-needed\"]\na => {}\n\n// Options: [\"as-needed\"]\na => a\n\n// Options: [\"as-needed\"]\n([a, b]) => {}\n\n// Options: [\"as-needed\"]\n({ a, b }) => {}\n\n// Options: [\"as-needed\"]\n(a = 10) => {}\n\n// Options: [\"as-needed\"]\n(...a) => a[0]\n\n// Options: [\"as-needed\"]\n(a, b) => {}\n\n// Options: [\"as-needed\"]\nasync ([a, b]) => {}\n\n// Options: [\"as-needed\"]\nasync (a, b) => {}\n\n// Options: [\"as-needed\"]\n(a: T) => a\n\n// Options: [\"as-needed\"]\n(a): T => a\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n() => {}\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\na => a\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n([a, b]) => {}\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n([a, b]) => a\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n({ a, b }) => {}\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n({ a, b }) => a + b\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n(a = 10) => {}\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n(...a) => a[0]\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n(a, b) => {}\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\na => ({})\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\nasync a => ({})\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\nasync a => a\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n(a: T) => a\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n(a): T => a\n\n// Options: [\"always\",{\"requireForBlockBody\":true}]\n<T>(a: T) => a\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":false}]\n<T>(a: T) => { return a; }\n\n// Options: [\"always\",{\"requireForBlockBody\":true}]\n<T>(a: T) => { return a; }\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n<T>(a: T) => { return a; }\n\n// Options: [\"as-needed\",{\"requireForBlockBody\":true}]\n(a): %checks => typeof a === \"number\"\n```\n\n\n\n<a name=\"boolean-style\"></a>\n### `boolean-style`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces a particular style for boolean type annotations. This rule takes one argument.\n\nIf it is `'boolean'` then a problem is raised when using `bool` instead of `boolean`.\n\nIf it is `'bool'` then a problem is raised when using `boolean` instead of `bool`.\n\nThe default value is `'boolean'`.\n\nThe following patterns are considered problems:\n\n```js\ntype X = bool\n// Message: Use \"boolean\", not \"bool\"\n\n// Options: [\"boolean\"]\ntype X = bool\n// Message: Use \"boolean\", not \"bool\"\n\n// Options: [\"bool\"]\ntype X = boolean\n// Message: Use \"bool\", not \"boolean\"\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype X = boolean\n\n// Options: [\"boolean\"]\ntype X = boolean\n\n// Options: [\"bool\"]\ntype X = bool\n\n// Options: [\"boolean\"]\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ntype X = bool\n```\n\n\n\n<a name=\"define-flow-type\"></a>\n### `define-flow-type`\n\n> @deprecated rule that is no longer needed with the current recommended config but kept around in case people want to continue using it with `@babel/eslint-parser` such as the `babel-parser` extension.\n\nMarks Flow type identifiers as defined.\n\nUsed to suppress [`no-undef`](http://eslint.org/docs/rules/no-undef) reporting of type identifiers.\n\nThe following patterns are not considered problems:\n\n```js\nvar a: AType\n// Additional rules: {\"no-undef\":2}\n\nvar a: AType; var b: AType\n// Additional rules: {\"no-undef\":2}\n\nvar a; (a: AType)\n// Additional rules: {\"no-undef\":2}\n\nvar a: AType<BType>\n// Additional rules: {\"no-undef\":2}\n\ntype A = AType\n// Additional rules: {\"no-undef\":2}\n\ndeclare type A = number\n// Additional rules: {\"no-undef\":2}\n\nopaque type A = AType\n// Additional rules: {\"no-undef\":2}\n\nfunction f(a: AType) {}\n// Additional rules: {\"no-undef\":2}\n\nfunction f(a: AType.a) {}\n// Additional rules: {\"no-undef\":2}\n\nfunction f(a: AType.a.b) {}\n// Additional rules: {\"no-undef\":2}\n\nfunction f(a): AType {}; var a: AType\n// Additional rules: {\"no-undef\":2}\n\nfunction f(a): AType {}\n// Additional rules: {\"no-undef\":2}\n\nclass C { a: AType }\n// Additional rules: {\"no-undef\":2}\n\nclass C { a: AType.a }\n// Additional rules: {\"no-undef\":2}\n\nclass C { a: AType.a.b }\n// Additional rules: {\"no-undef\":2}\n\nclass C implements AType {}\n// Additional rules: {\"no-undef\":2}\n\ndeclare interface A {}\n// Additional rules: {\"no-undef\":2}\n\n({ a: ({b() {}}: AType) })\n// Additional rules: {\"no-undef\":2}\n\ntype X = {Y<AType>(): BType}\n// Additional rules: {\"no-undef\":2}\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\n\n/**\n* Copyright 2019 no corp\n* @flow\n*/\ntype Foo = $ReadOnly<{}>\n// Additional rules: {\"no-undef\":2}\n\nenum Status { Active, Paused }\n// Additional rules: {\"no-undef\":2}\n\nenum Status { Active = 'active', Paused = 'paused' }\n// Additional rules: {\"no-undef\":2}\n\nenum Status { Active = 1, Paused = 2 }\n// Additional rules: {\"no-undef\":2}\n\nvar a: AType\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nvar a: AType; var b: AType\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nvar a; (a: AType)\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nvar a: AType<BType>\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\ntype A = AType\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\ndeclare type A = number\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nopaque type A = AType\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nfunction f(a: AType) {}\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nfunction f(a: AType.a) {}\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nfunction f(a: AType.a.b) {}\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nfunction f(a): AType {}; var a: AType\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nfunction f(a): AType {}\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nclass C { a: AType }\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nclass C { a: AType.a }\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nclass C { a: AType.a.b }\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nclass C implements AType {}\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\ndeclare interface A {}\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\n({ a: ({b() {}}: AType) })\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\ntype X = {Y<AType>(): BType}\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\n\n/**\n* Copyright 2019 no corp\n* @flow\n*/\ntype Foo = $ReadOnly<{}>\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nenum Status { Active, Paused }\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nenum Status { Active = 'active', Paused = 'paused' }\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n\nenum Status { Active = 1, Paused = 2 }\n// Additional rules: {\"no-undef\":2,\"no-use-before-define\":[2,\"nofunc\"]}\n```\n\n\n\n<a name=\"delimiter-dangle\"></a>\n### `delimiter-dangle`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces consistent use of trailing commas in Object and Tuple annotations.\n\nThis rule takes three arguments where the possible values are the same as ESLint's default `comma-dangle` rule:\n\n1. The first argument is for Object and Tuple annotations. The default value is `'never'`.\n2. The second argument is used for Interface annotations. This defaults to the value of the first argument.\n3. The third argument is used for inexact object notation (trailing `...`). The default value is `'never'`.\n\nIf it is `'never'` then a problem is raised when there is a trailing comma.\n\nIf it is `'always'` then a problem is raised when there is no trailing comma.\n\nIf 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.\n\nIf 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.\n\nThe following patterns are considered problems:\n\n```js\ntype X = { foo: string, }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = { foo: string, }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = { foo: string; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = {\nfoo: string,\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always\"]\ntype X = { foo: string }\n// Message: Missing trailing delimiter\n\n// Options: [\"always\"]\ntype X = {\nfoo: string\n}\n// Message: Missing trailing delimiter\n\n// Options: [\"always-multiline\"]\ntype X = { foo: string, }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always-multiline\"]\ntype X = {\nfoo: string\n}\n// Message: Missing trailing delimiter\n\n// Options: [\"only-multiline\"]\ntype X = { foo: string; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always\",\"never\"]\ninterface X { foo: string; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = { [key: string]: number, }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always\"]\ntype X = { [key: string]: number }\n// Message: Missing trailing delimiter\n\n// Options: [\"always-multiline\"]\ntype X = { [key: string]: number, }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always-multiline\"]\ntype X = {\n[key: string]: number\n}\n// Message: Missing trailing delimiter\n\n// Options: [\"only-multiline\"]\ntype X = { [key: string]: number; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = { [key: string]: number, foo: string, }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = {\n[key: string]: number,\nfoo: string,\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = {\n[key: string]: number,\naReallyLongPropertyNameHere: string,\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always\"]\ntype X = { [key: string]: number, foo: string }\n// Message: Missing trailing delimiter\n\n// Options: [\"always\"]\ntype X = {\n[key: string]: number;\nfoo: string\n}\n// Message: Missing trailing delimiter\n\n// Options: [\"always-multiline\"]\ntype X = { [key: string]: number, foo: string, }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always-multiline\"]\ntype X = {\n[key: string]: number,\nfoo: string\n}\n// Message: Missing trailing delimiter\n\n// Options: [\"only-multiline\"]\ntype X = { [key: string]: number, foo: string, }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = { foo: string, [key: string]: number, }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = {\nfoo: string,\n[key: string]: number,\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = {\naReallyLongPropertyNameHere: string,\n[key: string]: number,\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always\"]\ntype X = { foo: string, [key: string]: number }\n// Message: Missing trailing delimiter\n\n// Options: [\"always\"]\ntype X = { foo: string; [key: string]: number }\n// Message: Missing trailing delimiter\n\n// Options: [\"always-multiline\"]\ntype X = { foo: string, [key: string]: number; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always-multiline\"]\ntype X = {\nfoo: string,\n[key: string]: number\n}\n// Message: Missing trailing delimiter\n\n// Options: [\"only-multiline\"]\ntype X = { foo: string, [key: string]: number; }\n// Message: Unexpected trailing delimiter\n\ntype X = { ..., }\n// Message: Unexpected trailing delimiter\n\ntype X = { ...; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = { ..., }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = { ...; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = { ... }\n// Message: Missing trailing delimiter\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = { ..., }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = { ...; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = { ..., }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = { ...; }\n// Message: Unexpected trailing delimiter\n\ntype X = {\n...,\n}\n// Message: Unexpected trailing delimiter\n\ntype X = {\n...;\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = {\n...,\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = {\n...;\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = {\n...\n}\n// Message: Missing trailing delimiter\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = {\n...\n}\n// Message: Missing trailing delimiter\n\ntype X = { foo: string, ..., }\n// Message: Unexpected trailing delimiter\n\ntype X = { foo: string; ...; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = { foo: string, ..., }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = { foo: string; ...; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = { foo: string, ... }\n// Message: Missing trailing delimiter\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = { foo: string, ..., }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = { foo: string; ...; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = { foo: string, ..., }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = { foo: string; ...; }\n// Message: Unexpected trailing delimiter\n\ntype X = {\nfoo: string,\n...,\n}\n// Message: Unexpected trailing delimiter\n\ntype X = {\nfoo: string;\n...;\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = {\nfoo: string,\n...,\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = {\nfoo: string;\n...;\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = {\nfoo: string,\n...\n}\n// Message: Missing trailing delimiter\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = {\nfoo: string,\n...\n}\n// Message: Missing trailing delimiter\n\ntype X = { [key: string]: number, ..., }\n// Message: Unexpected trailing delimiter\n\ntype X = { [key: string]: number; ...; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = { [key: string]: number, ..., }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = { [key: string]: number; ...; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = { [key: string]: number, ... }\n// Message: Missing trailing delimiter\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = { [key: string]: number, ..., }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = { [key: string]: number; ...; }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = { [key: string]: number, ..., }\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = { [key: string]: number; ...; }\n// Message: Unexpected trailing delimiter\n\ntype X = {\n[key: string]: number,\n...,\n}\n// Message: Unexpected trailing delimiter\n\ntype X = {\n[key: string]: number;\n...;\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = {\n[key: string]: number,\n...,\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = {\n[key: string]: number;\n...;\n}\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = {\n[key: string]: number,\n...\n}\n// Message: Missing trailing delimiter\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = {\n[key: string]: number,\n...\n}\n// Message: Missing trailing delimiter\n\ntype X = [string, number,]\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = [string, number,]\n// Message: Unexpected trailing delimiter\n\n// Options: [\"never\"]\ntype X = [\nstring,\nnumber,\n]\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always\"]\ntype X = [string, number]\n// Message: Missing trailing delimiter\n\n// Options: [\"always\"]\ntype X = [\nstring,\nnumber\n]\n// Message: Missing trailing delimiter\n\n// Options: [\"always-multiline\"]\ntype X = [string, number,]\n// Message: Unexpected trailing delimiter\n\n// Options: [\"always-multiline\"]\ntype X = [\nfoo, string\n]\n// Message: Missing trailing delimiter\n\n// Options: [\"only-multiline\"]\ntype X = [ number, string, ]\n// Message: Unexpected trailing delimiter\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype X = { foo: string }\n\n// Options: [\"never\"]\ntype X = { foo: string }\n\n// Options: [\"always\"]\ntype X = { foo: string, }\n\n// Options: [\"always\"]\ntype X = { foo: string; }\n\n// Options: [\"never\"]\ntype X = {\nfoo: string\n}\n\n// Options: [\"always\"]\ntype X = {\nfoo: string,\n}\n\n// Options: [\"always-multiline\"]\ntype X = { foo: string }\n\n// Options: [\"always-multiline\"]\ntype X = {\nfoo: string,\n}\n\n// Options: [\"always-multiline\"]\ntype X = {\nfoo: string;\n}\n\n// Options: [\"only-multiline\"]\ntype X = { foo: string }\n\n// Options: [\"only-multiline\"]\ntype X = {\nfoo: string\n}\n\n// Options: [\"only-multiline\"]\ntype X = {\nfoo: string,\n}\n\n// Options: [\"only-multiline\"]\ntype X = {\nfoo: string;\n}\n\n// Options: [\"never\",\"always\"]\ninterface X { foo: string; }\n\n// Options: [\"never\"]\ntype X = {}\n\n// Options: [\"always\"]\ntype X = {}\n\n// Options: [\"always-multiline\"]\ntype X = {}\n\n// Options: [\"only-multiline\"]\ntype X = {}\n\n// Options: [\"never\"]\ntype X = { [key: string]: number }\n\n// Options: [\"always\"]\ntype X = { [key: string]: number, }\n\n// Options: [\"always\"]\ntype X = { [key: string]: number; }\n\n// Options: [\"always-multiline\"]\ntype X = { [key: string]: number }\n\n// Options: [\"always-multiline\"]\ntype X = {\n[key: string]: number,\n}\n\n// Options: [\"only-multiline\"]\ntype X = {\n[key: string]: number,\n}\n\n// Options: [\"only-multiline\"]\ntype X = {\n[key: string]: number\n}\n\n// Options: [\"only-multiline\"]\ntype X = { [key: string]: number }\n\n// Options: [\"never\"]\ntype X = { [key: string]: number, foo: string }\n\n// Options: [\"always\"]\ntype X = { [key: string]: number, foo: string, }\n\n// Options: [\"always\"]\ntype X = { [key: string]: number; foo: string; }\n\n// Options: [\"always-multiline\"]\ntype X = { [key: string]: number, foo: string }\n\n// Options: [\"always-multiline\"]\ntype X = {\n[key: string]: number,\nfoo: string,\n}\n\n// Options: [\"only-multiline\"]\ntype X = {\n[key: string]: number,\nfoo: string,\n}\n\n// Options: [\"only-multiline\"]\ntype X = {\n[key: string]: number;\nfoo: string\n}\n\n// Options: [\"only-multiline\"]\ntype X = { [key: string]: number, foo: string }\n\n// Options: [\"never\"]\ntype X = { foo: string, [key: string]: number }\n\n// Options: [\"always\"]\ntype X = { foo: string, [key: string]: number, }\n\n// Options: [\"always\"]\ntype X = { foo: string; [key: string]: number; }\n\n// Options: [\"always-multiline\"]\ntype X = { foo: string, [key: string]: number }\n\n// Options: [\"always-multiline\"]\ntype X = {\nfoo: string,\n[key: string]: number,\n}\n\n// Options: [\"only-multiline\"]\ntype X = {\nfoo: string,\n[key: string]: number,\n}\n\n// Options: [\"only-multiline\"]\ntype X = {\nfoo: string;\n[key: string]: number\n}\n\n// Options: [\"only-multiline\"]\ntype X = { foo: string, [key: string]: number }\n\ntype X = { ... }\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = { ... }\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = { ..., }\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = { ... }\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = { ... }\n\ntype X = {\n...\n}\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = {\n...\n}\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = {\n...,\n }\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = {\n...;\n }\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = {\n...,\n}\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = {\n...;\n}\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = {\n...\n}\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = {\n...,\n}\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = {\n...;\n}\n\ntype X = { foo: string, ... }\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = { foo: string, ... }\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = { foo: string, ..., }\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = { foo: string; ...; }\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = { foo: string, ... }\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = { foo: string, ... }\n\ntype X = {\nfoo: string,\n...\n}\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = {\nfoo: string,\n...\n}\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = {\nfoo: string,\n...,\n}\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = {\nfoo: string;\n...;\n}\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = {\nfoo: string,\n...,\n}\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = {\nfoo: string;\n...;\n}\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = {\nfoo: string,\n...\n}\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = {\nfoo: string,\n...,\n}\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = {\nfoo: string,\n...;\n}\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = { [key: string]: number, ... }\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = { [key: string]: number, ..., }\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = { [key: string]: number; ...; }\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = { [key: string]: number, ... }\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = { [key: string]: number, ... }\n\n// Options: [\"never\",\"never\",\"never\"]\ntype X = {\n[key: string]: number,\n...\n}\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = {\n[key: string]: number,\n...,\n}\n\n// Options: [\"never\",\"never\",\"always\"]\ntype X = {\n[key: string]: number;\n...;\n}\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = {\n[key: string]: number,\n...,\n}\n\n// Options: [\"never\",\"never\",\"always-multiline\"]\ntype X = {\n[key: string]: number;\n...;\n}\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = {\n[key: string]: number,\n...\n}\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = {\n[key: string]: number,\n...,\n}\n\n// Options: [\"never\",\"never\",\"only-multiline\"]\ntype X = {\n[key: string]: number;\n...;\n}\n\ntype X = [string, number]\n\n// Options: [\"never\"]\ntype X = [string, number]\n\n// Options: [\"never\"]\ntype X = [\nstring,\nnumber\n]\n\n// Options: [\"always\"]\ntype X = [string, number,]\n\n// Options: [\"always\"]\ntype X = [\nstring,\nnumber,\n]\n\n// Options: [\"always-multiline\"]\ntype X = [ foo, string ]\n\n// Options: [\"always-multiline\"]\ntype X = [\nfoo, string,\n]\n\n// Options: [\"only-multiline\"]\ntype X = [ number, string ]\n\n// Options: [\"only-multiline\"]\ntype X = [\nnumber,\nstring\n]\n\n// Options: [\"only-multiline\"]\ntype X = [\nnumber,\nstring,\n]\n\n// Options: [\"never\"]\ntype X = []\n\n// Options: [\"always\"]\ntype X = []\n\n// Options: [\"always-multiline\"]\ntype X = []\n\n// Options: [\"only-multiline\"]\ntype X = []\n```\n\n\n\n<a name=\"enforce-line-break\"></a>\n### `enforce-line-break`\n\nThis rule enforces line breaks between type definitions.\n\nThe following patterns are considered problems:\n\n```js\ntype baz = 6;\nconst hi = 2;\n// Message: New line required below type declaration\n\nconst foo = 6;\ntype hi = 2;\n\n// Message: New line required above type declaration\n\nconst som = \"jes\";\n// a comment\ntype fed = \"hed\";\n\n// Message: New line required above type declaration\n\ntype som = \"jes\";\n// a comment\nconst fed = \"hed\";\n\n// Message: New line required below type declaration\n\ntype hello = 34;\nconst som = \"jes\";\ntype fed = \"hed\";\n\n// Message: New line required below type declaration\n// Message: New line required above type declaration\n\nconst a = 5;\nexport type hello = 34;\n\n// Message: New line required above type declaration\n\nconst a = 5;\n// a comment\nexport type hello = 34;\n\n// Message: New line required above type declaration\n\nconst a = 5;\n/**\n * a jsdoc block\n */\ntype hello = 34;\n// Message: New line required above type declaration\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype gjs = 6;\n\ntype gjs = 6;\n\ntype hi = 2;\n\n\ntype X = 4;\n\nconst red = \"serpent\";\nconsole.log(\"hello\");\n\n// number or string\ntype Y = string | number;\n\n// resting + sleep\ntype snooze = \"dreaming\" | \"\";\n\ntype Props = {\n  accountBalance: string | number,\n  accountNumber: string | number,\n};\n\nconst x = 4;\nconst y = 489;\n\n// Some Comment\ntype Props = {\n  accountBalance: string | number,\n  accountNumber: string | number,\n};\n\ntype RoadT = \"grass\" | \"gravel\" | \"cement\";\n\n// @flow\ntype A = string\n```\n\n\n\n<a name=\"enforce-suppression-code\"></a>\n### `enforce-suppression-code`\n\nThis rule enforces a suppression code on flow suppression comments such as `$FlowFixMe` and `$FlowExpectedError`.\n\nThe following patterns are considered problems:\n\n```js\n// $FlowFixMe I am doing something evil here\nconst text = 'HELLO';\n// Message: $FlowFixMe is missing a suppression error code. Please update this suppression to use an error code: $FlowFixMe[…]\n\n// $FlowExpectedError I am doing something evil here\nconst text = 'HELLO';\n// Message: $FlowExpectedError is missing a suppression error code. Please update this suppression to use an error code: $FlowExpectedError[…]\n\n// $FlowIssue I am doing something evil here\nconst text = 'HELLO';\n// Message: $FlowIssue is missing a suppression error code. Please update this suppression to use an error code: $FlowIssue[…]\n\n// $FlowIgnore I am doing something evil here\nconst text = 'HELLO';\n// Message: $FlowIgnore is missing a suppression error code. Please update this suppression to use an error code: $FlowIgnore[…]\n\n/* $FlowIgnore I am doing something evil here */\n// Message: $FlowIgnore is missing a suppression error code. Please update this suppression to use an error code: $FlowIgnore[…]\n\n{ /* $FlowIgnore I am doing something evil here */ }\n// Message: $FlowIgnore is missing a suppression error code. Please update this suppression to use an error code: $FlowIgnore[…]\n\n/**\n  * $FlowIgnore I am doing something evil here\n  */\n// Message: $FlowIgnore is missing a suppression error code. Please update this suppression to use an error code: $FlowIgnore[…]\n```\n\nThe following patterns are not considered problems:\n\n```js\n// Just a random comment\n//\nconst text = 'HELLO';\n\n// $FlowFixMe[incompatible-call] TODO 48\nconst text = 'HELLO';\n\n// $FlowExpectedError[incompatible-call] TODO 48\nconst text = 'HELLO';\n\n// $FlowIssue[incompatible-call] TODO 48\nconst text = 'HELLO';\n\n// $FlowIgnore[incompatible-call] TODO 48\nconst text = 'HELLO';\n\n/* $FlowIgnore[incompatible-call] TODO 48 */\n\n/**\n * $FlowIgnore[incompatible-call] TODO 48\n */\n\n/* $FlowIgnore[incompatible-call] TODO 48 */\n```\n\n\n\n<a name=\"generic-spacing\"></a>\n### `generic-spacing`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces consistent spacing within generic type annotation parameters.\n\nThis 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.\n\nThe default value is `'never'`.\n\nThe following patterns are considered problems:\n\n```js\ntype X = Promise< string>\n// Message: There must be no space at start of \"Promise\" generic type annotation\n\n// Options: [\"never\"]\ntype X = Promise<  string>\n// Message: There must be no space at start of \"Promise\" generic type annotation\n\ntype X = FooBar<string >\n// Message: There must be no space at end of \"FooBar\" generic type annotation\n\ntype X = Promise< string >\n// Message: There must be no space at start of \"Promise\" generic type annotation\n// Message: There must be no space at end of \"Promise\" generic type annotation\n\ntype X = Promise< (foo), bar, (((baz))) >\n// Message: There must be no space at start of \"Promise\" generic type annotation\n// Message: There must be no space at end of \"Promise\" generic type annotation\n\n// Options: [\"always\"]\ntype X = Promise<string >\n// Message: There must be a space at start of \"Promise\" generic type annotation\n\n// Options: [\"always\"]\ntype X = FooBar< string>\n// Message: There must be a space at end of \"FooBar\" generic type annotation\n\n// Options: [\"always\"]\ntype X = Promise<string>\n// Message: There must be a space at start of \"Promise\" generic type annotation\n// Message: There must be a space at end of \"Promise\" generic type annotation\n\n// Options: [\"always\"]\ntype X = Promise<(foo), bar, (((baz)))>\n// Message: There must be a space at start of \"Promise\" generic type annotation\n// Message: There must be a space at end of \"Promise\" generic type annotation\n\n// Options: [\"always\"]\ntype X = FooBar<  string >\n// Message: There must be one space at start of \"FooBar\" generic type annotation\n\n// Options: [\"always\"]\ntype X = FooBar< string  >\n// Message: There must be one space at end of \"FooBar\" generic type annotation\n\n// Options: [\"always\"]\ntype X = Promise<  (foo), bar, (((baz)))  >\n// Message: There must be one space at start of \"Promise\" generic type annotation\n// Message: There must be one space at end of \"Promise\" generic type annotation\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype X = Promise<string>\n\ntype X = Promise<(string)>\n\ntype X = Promise<(foo), bar, (((baz)))>\n\ntype X = Promise<\n  (foo),\n  bar,\n  (((baz)))\n>\n\ntype X =  Promise<\r\n    (foo),\r\n    bar,\r\n    (((baz)))\r\n>\n\n// Options: [\"always\"]\ntype X = Promise< string >\n\n// Options: [\"always\"]\ntype X = Promise< (string) >\n\n// Options: [\"always\"]\ntype X = Promise< (foo), bar, (((baz))) >\n```\n\n\n\n<a name=\"interface-id-match\"></a>\n### `interface-id-match`\n\nEnforces a consistent naming pattern for interfaces.\n\n<a name=\"options\"></a>\n#### Options\n\nThis rule requires a text RegExp:\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/interface-id-match\": [\n            2,\n            \"^([A-Z][a-z0-9]*)+Type$\"\n        ]\n    }\n}\n```\n\n`'^([A-Z][a-z0-9]*)+Type$'` is the default pattern.\n\nThe following patterns are considered problems:\n\n```js\ninterface foo{};\n// Message: Interface identifier 'foo' does not match pattern '/^([A-Z][a-z0-9]*)+Type$/u'.\n\n// Options: [\"^foo$\"]\ninterface FooType{};\n// Message: Interface identifier 'FooType' does not match pattern '/^foo$/u'.\n```\n\nThe following patterns are not considered problems:\n\n```js\ninterface FooType {};\n\n// Options: [\"^foo$\"]\ninterface foo {};\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ninterface foo {};\n```\n\n\n\n<a name=\"newline-after-flow-annotation\"></a>\n### `newline-after-flow-annotation`\n\nThis rule requires an empty line after the Flow annotation.\n\n<a name=\"options\"></a>\n#### Options\n\nThe rule has a string option:\n\n* `\"always\"` (default): Enforces that `@flow` annotations be followed by an empty line, separated by newline (LF)\n* `\"always-windows\"`: Identical to \"always\", but will use a CRLF when autofixing\n* `\"never\"`: Enforces that `@flow` annotations are not followed by empty lines\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/newline-after-flow-annotation\": [\n      2,\n      \"always\"\n    ]\n  }\n}\n```\n\n\nThe following patterns are considered problems:\n\n```js\n// @flow\nimport Foo from './foo';\n// Message: Expected newline after flow annotation\n\n// Options: [\"always\"]\n// @flow\nimport Foo from './foo';\n// Message: Expected newline after flow annotation\n\n// Options: [\"always-windows\"]\n// @flow\r\nimport Foo from './foo';\n// Message: Expected newline after flow annotation\n\n// Options: [\"never\"]\n// @flow\n\n\n// Message: Expected no newline after flow annotation\n```\n\nThe following patterns are not considered problems:\n\n```js\n// Options: [\"always\"]\n// @flow\n\nimport Foo from './foo';\n\n// Options: [\"always-windows\"]\n// @flow\r\n\r\nimport Foo from './foo';\n\n// Options: [\"never\"]\n// @flow\nimport Foo from './foo';\n```\n\n\n\n<a name=\"no-dupe-keys\"></a>\n### `no-dupe-keys`\n\nChecks for duplicate properties in Object annotations.\n\nThis rule mirrors ESLint's [no-dupe-keys](http://eslint.org/docs/rules/no-dupe-keys) rule.\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/no-dupe-keys\": 2\n    }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\ntype f = { a: number, b: string, a: number }\n// Message: Duplicate property.\n\ntype f = { a: number, b: string, a: string }\n// Message: Duplicate property.\n\ntype f = { get(key: \"a\"): string, get(key: \"a\"): string }\n// Message: Duplicate property.\n\ntype f = { get(key: 1): string, get(key: 1): string }\n// Message: Duplicate property.\n\ntype f = { get(key: 1.1): string, get(key: 1.1): string }\n// Message: Duplicate property.\n\ntype f = { get(key: true): string, get(key: true): string }\n// Message: Duplicate property.\n\ntype f = { get(key: {a: 1}): string, get(key: {a: 1}):string }\n// Message: Duplicate property.\n\nvar a = \"a\"; type f = { get(key: a): string, get(key: a): string }\n// Message: Duplicate property.\n\nvar b = 1; type f = { get(key: b): string, get(key: b): string }\n// Message: Duplicate property.\n\nvar c = true; type f = { get(key: c): string, get(key: c): string }\n// Message: Duplicate property.\n\nvar d = {}; type f = { get(key: d): string, get(key: d): string }\n// Message: Duplicate property.\n\nvar e = []; type f = { get(key: e): string, get(key: e): string }\n// Message: Duplicate property.\n\nvar e = [1, \"a\"]; type f = { get(key: e): string, get(key: e): string }\n// Message: Duplicate property.\n\nfunction fn() {}; type f = { get(key: fn): string, get(key: fn): string }\n// Message: Duplicate property.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype FooType = { a: number, b: string, c: number }\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ntype FooType = { a: number, b: string, a: number }\n\ntype f = { get(key: \"a\"): string, get(key: \"b\"): string }\n\ntype f = { get(key: 1): string, get(key: 2): string }\n\ntype f = { get(key: 1.1): string, get(key: 1.2): string }\n\ntype f = { get(key: true): string, get(key: false): string }\n\ntype f = { get(key: [\"a\", 1]): string, get(key: [\"a\", 2]): string }\n\ntype f = { get(key: [\"a\", [\"b\", 1]]): string, get(key: [\"a\", [\"b\", 2]]): string }\n\ntype f = { a: number, b: string, c: number }\n\ntype f = { get(key: \"a\"): string, get(key: \"b\"): string }\n\ntype f = { get(key: \"a\"): string, get(key: \"a\", key2: \"b\"): string }\n\ntype f = { get(key: \"a\"): string, get(key: 1): string }\n\ntype f = { get(key: { a: 1 }): string, get(key: { a: 2 }): string}\n\nvar a = {}; var b = {}; type f = { get(key: a): string, get(key: b): string }\n\nvar a = 1; var b = 1; type f = { get(key: a): string, get(key: b): string }\n\ntype a = { b: <C>(config: { ...C, key: string}) => C }\n\nexport interface Foo { get foo(): boolean; get bar(): string; }\n```\n\n\n\n<a name=\"no-duplicate-type-union-intersection-members\"></a>\n### `no-duplicate-type-union-intersection-members`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nChecks for duplicate members of a type union/intersection.\n\n<a name=\"options\"></a>\n#### Options\n\nYou can disable checking intersection types using `checkIntersections`.\n\n* `true` (default) - check for duplicate members of intersection members.\n* `false` - do not check for duplicate members of intersection members.\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/no-duplicate-type-union-intersection-members\": [\n      2,\n      {\n        \"checkIntersections\": true\n      }\n    ]\n  }\n}\n```\n\nYou can disable checking union types using `checkUnions`.\n\n* `true` (default) - check for duplicate members of union members.\n* `false` - do not check for duplicate members of union members.\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/no-duplicate-type-union-intersection-members\": [\n      2,\n      {\n        \"checkUnions\": true\n      }\n    ]\n  }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\ntype A = 1 | 2 | 3 | 1;\n// Message: Duplicate union member found \"1\".\n\ntype B = 'foo' | 'bar' | 'foo';\n// Message: Duplicate union member found \"'foo'\".\n\ntype C = A | B | A | B;\n// Message: Duplicate union member found \"A\".\n// Message: Duplicate union member found \"B\".\n\ntype C = A & B & A & B;\n// Message: Duplicate intersection member found \"A\".\n// Message: Duplicate intersection member found \"B\".\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype A = 1 | 2 | 3;\n\ntype B = 'foo' | 'bar';\n\ntype C = A | B;\n\ntype C = A & B;\n```\n\n\n\n<a name=\"no-existential-type\"></a>\n### `no-existential-type`\n\nDisallows use of the existential type (*). [See more](https://flow.org/en/docs/types/utilities/#toc-existential-type)\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/no-existential-type\": 2\n  }\n}\n```\n\n\nThe following patterns are considered problems:\n\n```js\ntype T = *;\n// Message: Unexpected use of existential type (*).\n\ntype T = U<*, *>;\n// Message: Unexpected use of existential type (*).\n// Message: Unexpected use of existential type (*).\n\nconst f: (*) => null = () => null;\n// Message: Unexpected use of existential type (*).\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype T = string | null\n```\n\n\n\n<a name=\"no-flow-fix-me-comments\"></a>\n### `no-flow-fix-me-comments`\n\nDisallows `$FlowFixMe` comment suppressions.\n\nThis is especially useful as a warning to ensure instances of `$FlowFixMe` in your codebase get fixed over time.\n\n<a name=\"options\"></a>\n#### Options\n\nThis rule takes an optional RegExp that comments a text RegExp that makes the supression valid.\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/no-flow-fix-me-comments\": [\n            1,\n            \"TODO\\s+[0-9]+\"\n        ]\n    }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\n// $FlowFixMe I am doing something evil here\nconst text = 'HELLO';\n// Message: $FlowFixMe is treated as 'any' and must be fixed.\n\n// Options: [\"TODO [0-9]+\"]\n// $FlowFixMe I am doing something evil here\nconst text = 'HELLO';\n// Message: $FlowFixMe is treated as 'any' and must be fixed. Fix it or match '/TODO [0-9]+/u'.\n\n// Options: [\"TODO [0-9]+\"]\n// $FlowFixMe TODO abc 47 I am doing something evil here\nconst text = 'HELLO';\n// Message: $FlowFixMe is treated as 'any' and must be fixed. Fix it or match '/TODO [0-9]+/u'.\n\n// $$FlowFixMeProps I am doing something evil here\nconst text = 'HELLO';\n// Message: $FlowFixMe is treated as 'any' and must be fixed.\n\n// Options: [\"TODO [0-9]+\"]\n// $FlowFixMeProps I am doing something evil here\nconst text = 'HELLO';\n// Message: $FlowFixMe is treated as 'any' and must be fixed. Fix it or match '/TODO [0-9]+/u'.\n```\n\nThe following patterns are not considered problems:\n\n```js\nconst text = 'HELLO';\n\n// Options: [\"TODO [0-9]+\"]\n// $FlowFixMe TODO 48\nconst text = 'HELLO';\n```\n\n\n\n<a name=\"no-flow-suppressions-in-strict-files\"></a>\n### `no-flow-suppressions-in-strict-files`\n\nThis rule validates that no error suppression comments (e.g. `$FlowFixMe`) are used in `// @flow strict` (or `// @flow strict-local`) files.\n\nThis codifies the best practices [as documented here](https://flow.org/en/docs/strict/#toc-adoption):\n\n> _\"Do not add `$FlowFixMe` to suppress the new errors as they appear; just add `@flow strict` once all issues have been resolved.\"_\n<a name=\"options\"></a>\n#### Options\n\nThis rule accepts 1 option as an object to disable errors being thrown on specific suppression error types. For example, you don't want `$FlowFixMe` but `$FlowExpectedError` you want to allow because they are expected issues that can't be solved.\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/no-flow-suppressions-in-strict-files\": [2, {\n      \"$FlowExpectedError\": false\n    }]\n  }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\n// Options: [{}]\n// @flow strict\n\n// $FlowFixMe\nconst text: string = 42;\n// Message: No suppression comments are allowed in \"strict\" Flow files. Either remove the error suppression, or lower the strictness of this module.\n\n// Options: [{}]\n// @flow strict-local\n\n// $FlowFixMe\nconst text: string = 42;\n// Message: No suppression comments are allowed in \"strict\" Flow files. Either remove the error suppression, or lower the strictness of this module.\n\n// Options: [{}]\n// @flow strict\n\n// $FlowExpectedError[xxx]\nconst text: string = 42;\n// Message: No suppression comments are allowed in \"strict\" Flow files. Either remove the error suppression, or lower the strictness of this module.\n\n// Options: [{\"$FlowExpectedError\":false}]\n// @flow strict\n\n// $FlowFixMe\nconst text: string = 42;\n// Message: No suppression comments are allowed in \"strict\" Flow files. Either remove the error suppression, or lower the strictness of this module.\n```\n\nThe following patterns are not considered problems:\n\n```js\n// Options: [{}]\n// @flow\n\n// Error suppressions are fine in \"normal\" Flow files\n// $FlowFixMe\nconst text: string = 42;\n\n// Options: [{}]\n// @flow strict\n\n// Definitely nothing to suppress here\n// ...\n\n// Options: [{}]\n// @flow strict-local\n\n// Definitely nothing to suppress here\n// ...\n\n// Options: [{\"$FlowExpectedError\":false}]\n// @flow strict\n\n// $FlowExpectedError\nconst text: string = 42;\n\n// Options: [{\"$FlowExpectedError\":false}]\n// @flow strict-local\n\n// $FlowExpectedError\nconst text: string = 42;\n```\n\n\n\n<a name=\"no-internal-flow-type\"></a>\n### `no-internal-flow-type`\n\nWarns against using internal Flow types such as `React$Node`, `React$Ref` and others and suggests using public alternatives instead (`React.Node`, `React.Ref`, …).\n\nThe following patterns are considered problems:\n\n```js\ntype X = React$AbstractComponent<Config, Instance>\n// Message: Type identifier 'React$AbstractComponent' is not allowed. Use 'React.AbstractComponent' instead.\n\ntype X = React$ChildrenArray<string>\n// Message: Type identifier 'React$ChildrenArray' is not allowed. Use 'React.ChildrenArray' instead.\n\ntype X = React$ComponentType<Props>\n// Message: Type identifier 'React$ComponentType' is not allowed. Use 'React.ComponentType' instead.\n\ntype X = React$Config<Prosp, DefaultProps>\n// Message: Type identifier 'React$Config' is not allowed. Use 'React.Config' instead.\n\ntype X = React$Element<typeof Component>\n// Message: Type identifier 'React$Element' is not allowed. Use 'React.Element' instead.\n\ntype X = React$ElementConfig<typeof Component>\n// Message: Type identifier 'React$ElementConfig' is not allowed. Use 'React.ElementConfig' instead.\n\ntype X = React$ElementProps<typeof Component>\n// Message: Type identifier 'React$ElementProps' is not allowed. Use 'React.ElementProps' instead.\n\ntype X = React$ElementRef<typeof Component>\n// Message: Type identifier 'React$ElementRef' is not allowed. Use 'React.ElementRef' instead.\n\ntype X = React$ElementType\n// Message: Type identifier 'React$ElementType' is not allowed. Use 'React.ElementType' instead.\n\ntype X = React$Key\n// Message: Type identifier 'React$Key' is not allowed. Use 'React.Key' instead.\n\ntype X = React$Node\n// Message: Type identifier 'React$Node' is not allowed. Use 'React.Node' instead.\n\ntype X = React$Ref<typeof Component>\n// Message: Type identifier 'React$Ref' is not allowed. Use 'React.Ref' instead.\n\ntype X = React$StatelessFunctionalComponent<Props>\n// Message: Type identifier 'React$StatelessFunctionalComponent' is not allowed. Use 'React.StatelessFunctionalComponent' instead.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype X = React.AbstractComponent<Config, Instance>\n\ntype X = React.ChildrenArray<string>\n\ntype X = React.ComponentType<Props>\n\ntype X = React.Config<Props, DefaultProps>\n\ntype X = React.Element<typeof Component>\n\ntype X = React.ElementConfig<typeof Component>\n\ntype X = React.ElementProps<typeof Component>\n\ntype X = React.ElementRef<typeof Component>\n\ntype X = React.ElementType\n\ntype X = React.Key\n\ntype X = React.Node\n\ntype X = React.Ref<typeof Component>\n\ntype X = React.StatelessFunctionalComponent<Props>\n\ntype X = React$Rocks\n```\n\n\n\n<a name=\"no-mixed\"></a>\n### `no-mixed`\n\nWarns against \"mixed\" type annotations.\nThese types are not strict enough and could often be made more specific.\n\nThe following patterns are considered problems:\n\nThe following patterns are considered problems:\n\n```js\nfunction foo(thing): mixed {}\n// Message: Unexpected use of mixed type\n\nfunction foo(thing): Promise<mixed> {}\n// Message: Unexpected use of mixed type\n\nfunction foo(thing): Promise<Promise<mixed>> {}\n// Message: Unexpected use of mixed type\n```\n\nThe following patterns are not considered problems:\n\n```js\nfunction foo(thing): string {}\n\nfunction foo(thing): Promise<string> {}\n\nfunction foo(thing): Promise<Promise<string>> {}\n\n(foo?: string) => {}\n\n(foo: ?string) => {}\n\n(foo: { a: string }) => {}\n\n(foo: { a: ?string }) => {}\n\n(foo: string[]) => {}\n\ntype Foo = string\n\ntype Foo = { a: string }\n\ntype Foo = { (a: string): string }\n\nfunction foo(thing: string) {}\n\nvar foo: string\n\nclass Foo { props: string }\n```\n\n\n\n<a name=\"no-mutable-array\"></a>\n### `no-mutable-array`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nRequires 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)).\n\nGeneral reasons for using immutable data structures:\n\n* They are simpler to construct, test, and use\n* They help to avoid temporal coupling\n* Their usage is side-effect free (no defensive copies)\n* Identity mutability problem is avoided\n* They always have failure atomicity\n* They are much easier to cache\n\nNote 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.\n\nThe following patterns are considered problems:\n\n```js\ntype X = Array<string>\n// Message: Use \"$ReadOnlyArray\" instead of \"Array\"\n\ntype X = string[]\n// Message: Use \"$ReadOnlyArray\" instead of array shorthand notation\n\nconst values: Array<Array<string>> = [];\n// Message: Use \"$ReadOnlyArray\" instead of \"Array\"\n\nlet values: Array<Array<string>>;\n// Message: Use \"$ReadOnlyArray\" instead of \"Array\"\n// Message: Use \"$ReadOnlyArray\" instead of \"Array\"\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype X = $ReadOnlyArray<string>\n\nconst values: Array<$ReadOnlyArray<string>> = [];\n\nconst values: $ReadOnlyArray<string>[] = [];\n\nconst values: Array<$ReadOnlyArray<string>> = new Array();\n\nconst values: Array<$ReadOnlyArray<string>> = Array();\n```\n\n\n\n<a name=\"no-primitive-constructor-types\"></a>\n### `no-primitive-constructor-types`\n\nDisallows use of primitive constructors as types, such as `Boolean`, `Number` and `String`. [See more](https://flow.org/en/docs/types/primitives/).\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/no-primitive-constructor-types\": 2\n    }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\ntype x = Number\n// Message: Unexpected use of Number constructor type.\n\ntype x = String\n// Message: Unexpected use of String constructor type.\n\ntype x = Boolean\n// Message: Unexpected use of Boolean constructor type.\n\ntype x = { a: Number }\n// Message: Unexpected use of Number constructor type.\n\ntype x = { a: String }\n// Message: Unexpected use of String constructor type.\n\ntype x = { a: Boolean }\n// Message: Unexpected use of Boolean constructor type.\n\n(x: Number) => {}\n// Message: Unexpected use of Number constructor type.\n\n(x: String) => {}\n// Message: Unexpected use of String constructor type.\n\n(x: Boolean) => {}\n// Message: Unexpected use of Boolean constructor type.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype x = number\n\ntype x = string\n\ntype x = boolean\n\ntype x = { a: number }\n\ntype x = { a: string }\n\ntype x = { a: boolean }\n\n(x: number) => {}\n\n(x: string) => {}\n\n(x: boolean) => {}\n\ntype x = MyNumber\n\ntype x = MyString\n\ntype x = MyBoolean\n```\n\n\n\n<a name=\"no-types-missing-file-annotation\"></a>\n### `no-types-missing-file-annotation`\n\nDisallows Flow type imports, aliases, and annotations in files missing a valid Flow file declaration (or a @noflow annotation).\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/no-types-missing-file-annotation\": 2\n    }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\nconst x: number = 42;\n// Message: Type annotations require valid Flow declaration.\n\ntype FooType = number;\n// Message: Type aliases require valid Flow declaration.\n\nimport type A from \"a\"\n// Message: Type imports require valid Flow declaration.\n\nimport type {A} from \"a\"\n// Message: Type imports require valid Flow declaration.\n\nimport {type A} from \"a\"\n// Message: Type imports require valid Flow declaration.\n\nexport type {A} from \"a\"\n// Message: Type exports require valid Flow declaration.\n\nfunction t<T>(): T{}\n// Message: Type annotations require valid Flow declaration.\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\nconst x: number = 42;\n// Message: Type annotations require valid Flow declaration.\n```\n\nThe following patterns are not considered problems:\n\n```js\n// @flow\nconst x: number = 42;\n\n/* @flow weak */\ntype FooType = number;\n\n/* @noflow */\ntype FooType = number;\n\n/* @noflow */\nimport type A from \"a\"\n\n/* @noflow */\nimport {type A} from \"a\"\n\n/* @noflow */\nexport type {A} from \"a\"\n\n// an unrelated comment\n// @flow\nexport type {A} from \"a\"\n```\n\n\n\n<a name=\"no-unused-expressions\"></a>\n### `no-unused-expressions`\n\nAn extension of [ESLint's `no-unused-expressions`](https://eslint.org/docs/rules/no-unused-expressions).\nThis rule ignores type cast expressions and optional call expressions, but otherwise behaves the same as ESLint's\n`no-unused-expressions`.\n\nBare type casts are useful, for example to assert the exhaustiveness of a `switch`:\n\n```js\ntype Action\n  = { type: 'FOO', doFoo: (_: number) => void }\n  | { type: 'BAR', doBar: (_: string) => void };\n\ntype State = { foo: number, bar: string };\n\nfunction runFooBar(action: Action, state: State): void {\n  switch (action.type) {\n    case 'FOO':\n      doFoo(state.foo);\n      break;\n    case 'BAR':\n      doBar(state.bar);\n      break;\n    default:\n      (action: empty);  // type error when `Action` is extended with new types\n      console.error(`Impossible action: ${action.toString()}`);\n  }\n}\n```\n\nThis rule takes the same arguments as ESLint's `no-unused-expressions`. See\n[that rule's documentation](https://eslint.org/docs/rules/no-unused-expressions) for details.\n\nThe following patterns are considered problems:\n\n```js\nfoo + 1\n// Message: Expected an assignment or function call and instead saw an expression.\n\nx?.y\n// Message: Expected an assignment or function call and instead saw an expression.\n```\n\nThe following patterns are not considered problems:\n\n```js\n(foo: number)\n\nx?.y()\n```\n\n\n\n<a name=\"no-weak-types\"></a>\n### `no-weak-types`\n\nWarns against weak type annotations *any*, *Object* and *Function*.\nThese types can cause flow to silently skip over portion","readmeFilename":"README.md"}