{"versions":{"1.1.0":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"1.1.0","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"gitdown ./.README/README.md --output-file ./README.md && npm run documentation-add-assertions","documentation-add-assertions":"babel-node ./scripts/addAssertions","lint":"eslint ./src ./tests","test":"mocha --require @babel/register ./tests/rules/index.js","prepublishOnly":"yarn documentation-add-assertions && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-syntax-jsx":"^7.16.0","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-config-canonical":"^32.15.0","eslint-plugin-eslint-plugin":"^4.0.2","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.0.1","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.0","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.27.1","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","gitdown":"^3.1.4","glob":"^7.2.0","husky":"^7.0.4","lint-staged":"^12.1.2","mocha":"^9.1.3","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","@babel/plugin-syntax-flow":"^7.14.5","@babel/plugin-syntax-jsx":"^7.16.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"7db092660d2f67de38b8dd4cb8fd8b900c95b4ab","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@1.1.0","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-Z1MVInDFYHV66Ok0dA+jR7fiHLCYY8eDl0z8yiQ/wAXkmfOJ8fEuHeFvx+z5Ykt3IojhWrmLKkDbC/KDj7FCQw==","shasum":"bc41e242b26e542c9eb23280eacae933a43f7447","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-1.1.0.tgz","fileCount":82,"unpackedSize":326384,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhvmKFCRA9TVsSAnZWagAAUGQP/1D/G0ix/scHL9Igrads\ngR+ubd+e/hDw1CVFy4rjEMCqcd3KiLLawCvyStbUicXcQ2ywJt3JdlCHicsG\n9H2y5X5UvsC9X7UdeZG0gIayCuvWykvzCZAMHvldXbzZIzi72QmhZqre2ILW\nXfdTO+24VaXDB3qPTfDdudCTungqUEn5WGNCS8CDFe4sRcw23xFXmWGoxysS\n3+J2ux74kwCFjnXlOR8csSwWmTNbjx/J5QlarltoJcFVUzOqekU5WmYq4Mcd\ngE2L2uPEE9GkdpjOyC2IPSKdR9UhK+WQXa4hfH3JJi0MicBWsoQYzvFlPqVJ\nANsfZvk6rsi9afM5pVAa/OjOaBYmQCW9jjJSH3FeKvbVetI9fN37ToQLqB8Y\nTLF5B+J/xco1MF8oFmFU8rv/lpslbd25Y5vGgm79Cb3NKZv/Xitv6LNLDRZi\neoyzobNfsn4Ss3yE7rtqDsT/AdcMV4ZCbBp35MKnOe9TBvlz3un53KB+LSpy\nyHGLmxltLWRe3xdWBab1IYft1jOd1m9vOukZ62zikJxKabYZ1ZMfmgEdU3OR\nOOmvc7vCIrd82LWMZzgO2+XQqzhoB2wVl7/jg7QZuSo9jMiYBW0F2bAiuJbl\nw5JBiLGNQBITlmrcuHuqtWTLGd6lNfw6fS69+pCZb6fswqTERnpTLxgNf2yD\nLXY1\r\n=qlH/\r\n-----END PGP SIGNATURE-----\r\n","size":54358,"noattachment":false},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_1.1.0_1639867013087_0.9314591613311272"},"_hasShrinkwrap":false,"publish_time":1639867013267,"_cnpm_publish_time":1639867013267,"_cnpmcore_publish_time":"2021-12-18T22:37:06.213Z","contributors":[]},"1.0.2":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"1.0.2","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"gitdown ./.README/README.md --output-file ./README.md && npm run documentation-add-assertions","documentation-add-assertions":"babel-node ./scripts/addAssertions","lint":"eslint ./src ./tests","test":"mocha --require @babel/register ./tests/rules/index.js","prepublishOnly":"yarn documentation-add-assertions && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-syntax-jsx":"^7.16.0","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-config-canonical":"^32.15.0","eslint-plugin-eslint-plugin":"^4.0.2","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.0.1","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.0","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.27.1","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","gitdown":"^3.1.4","glob":"^7.2.0","husky":"^7.0.4","lint-staged":"^12.1.2","mocha":"^9.1.3","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","@babel/plugin-syntax-flow":"^7.14.5","@babel/plugin-syntax-jsx":"^7.16.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"4fb7838b76887b0d40b413b84a5b31775c1c2db8","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@1.0.2","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-zEhoVn/Q9uNfLuWD1IZvasX1gr0HXMbtn9wN6veiO8Qf/HrXG9kLEr0cvtQUGKjQNFciDTEDP6Sh20qWkr2dXw==","shasum":"3d67298cc7c36f1df9f1b7e19371d795b1a7af76","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-1.0.2.tgz","fileCount":119,"unpackedSize":859442,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhujYlCRA9TVsSAnZWagAAcOIP/0wEI/GmXPEXnZoDgmo1\nBjxraYTcbav897+c7O+0HHzwRqqWYI2ZGjZd5AaxIIvGKMtlS5hftSejOwOT\n1K5t5z0QF/NtAiSHXCzlO41oWW/zkxB19v82f7QctyDsiSaYDlVVa2KFbW+g\nkR6kel4OQ4qzXZpbrxIZaGQR/DZAdqKnUdwJX4j1Qeoh3/mpHMgSXEeLnw4v\n2gI56DEa9Rik6RVHb0wPBkd376X9wjBiaXSw8QpPBmUYothYr84ue2bz0M0j\nKNdhmDePa7QSmya7urKZ1tYoM8BzB8TcAtybBszcetZkmiaqLLd4vdn1ERNQ\nsDr6Rd4UKPT5ViUgpLOd+NWDqlEcc1mj75b9f0j9Qxh7WaTZaZx2HHDODeN2\n2yxdTgG9WL6wEQcEArU/WWuuEcm7WXlZyiBvpj/5EcqjUGU/UxscG2cLWFoM\n20JD5q54aeQTYvr4PUsXREl142Rd9K00lnxGg5av7pRBtznI2KkqjVqNMctv\nDKhVK9XNhw3HuEnpas3PdoiAeEQnpQYsi/KpiK0xY+uQDvVA0cXUwp6uvADh\nXoYxFg7KnYbsLc26cFgPDTye/rTxiHzl9fLSmC+I8l6cGdyl0xVKxkcs/b+J\n16PcQjAxu78oldr6xS2FWvZ9dMItxahKORuWrECyCHM2FJPvpz2DGlbzdcCm\nXrWb\r\n=Ppyh\r\n-----END PGP SIGNATURE-----\r\n","size":108409,"noattachment":false},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_1.0.2_1639593509215_0.9338152127553907"},"_hasShrinkwrap":false,"publish_time":1639593509388,"_cnpm_publish_time":1639593509388,"_cnpmcore_publish_time":"2021-12-18T22:37:06.450Z","contributors":[]},"1.0.1":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"1.0.1","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files","check-docs":"babel-node ./src/bin/checkDocs","check-tests":"babel-node ./src/bin/checkTests","create-readme":"gitdown ./.README/README.md --output-file ./README.md && npm run documentation-add-assertions","documentation-add-assertions":"babel-node ./src/bin/addAssertions","format-json":"jsonlint --sort-keys --in-place --indent \"  \" ./src/configs/recommended.json","lint":"eslint ./src ./tests","test":"mocha --require @babel/register ./tests/rules/index.js","prepublishOnly":"yarn documentation-add-assertions && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.0","@babel/eslint-parser":"^7.16.3","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.0","@babel/plugin-syntax-jsx":"^7.16.0","@babel/plugin-transform-react-jsx":"^7.16.0","@babel/preset-env":"^7.15.8","@babel/preset-flow":"^7.16.0","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.2","eslint-config-canonical":"^32.15.0","eslint-plugin-eslint-plugin":"^4.0.2","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-flowtype":"^8.0.3","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.0","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.27.1","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","gitdown":"^3.1.4","glob":"^7.2.0","husky":"^7.0.4","jsonlint-mod":"^1.7.6","lint-staged":"^12.1.2","mocha":"^9.1.3","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","@babel/plugin-syntax-flow":"^7.14.5","@babel/plugin-syntax-jsx":"^7.16.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"b6d2aa1003eb62710ceb59b0d14cd2b965660478","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@1.0.1","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-iRMHqeUph+uxBCyKeUhGa63t12U/ID6JWul//DdyuFkjXbYvC+NRiP9kiQnPflInFcO+kze+pgMOcBik9uTUig==","shasum":"9188c01396b1cbf91f3e80c40fac619d6d8f8ca9","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-1.0.1.tgz","fileCount":86,"unpackedSize":337773,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJht6+YCRA9TVsSAnZWagAAXyoQAJN/ghwa7dYLN5ptuaXk\n92OQV0XePrpZn7Ue194uH5ZCyMNjhob0OjdyMxEZfoFnzvtSkg65KMnGBINT\nrYgmBix2tJZjmMUEBB4TfKD75NfptG9TE5QljXqT2Exh+aC+8tFXb8P1LzB0\nb8vQaUZCw2AMuoK9jr0YtM0W6DjBLAwiPB5EwUZaKKbTkKO+kCjCKkBXZL3J\nxNXBRD+VbxBoBRO8I2c5qZMdDtoA+Jp7q/g/2EBEcc/sXCq+KWJ1UV30XFIK\nnX3LRwAn49BjHpaNJZDxA/U58H1jDql6T48AHpRNSKTVyR2D5RAhy7XOrQfg\nofhb+izfMBKN8wgVf/jOQWBgBN362t7XKfC3h3i527mofk81cDAcEhfwHC8s\n0lkt7lqACYtBnExWQzyH5MZCoqAeL2fBw3Udqc7psqNLLbazo//712M4FAKB\nIcLiyl4Zh5S4jv+nptNlVsEjQxMfUoLgYMUzKFeqhJUBT5dFbzqHsL4pV2DA\nQ5VX14uo9wXBtGXJVXgwhB2snaKYbGN8zvW9OYVS2wPYk/XwGWtimc/yIAcc\ncDe9jz1l60dWXOmM9UPpI8u0LWHX4b69JfMPHu+4IHst5+8GepA5l9j1nMlA\nS/HrnjHBAhN2vMoD6z3GJM9fe9C7bw9d0FogaMKLxYPxdtThjJoRzuN2On6X\nJS/m\r\n=Dvow\r\n-----END PGP SIGNATURE-----\r\n","size":56286,"noattachment":false},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_1.0.1_1639427992538_0.08064791197766841"},"_hasShrinkwrap":false,"publish_time":1639427992904,"_cnpm_publish_time":1639427992904,"_cnpmcore_publish_time":"2021-12-18T22:37:06.668Z","contributors":[]},"1.0.0":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"1.0.0","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.0.0"},"scripts":{"build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files","check-docs":"babel-node ./src/bin/checkDocs","check-tests":"babel-node ./src/bin/checkTests","create-readme":"gitdown ./.README/README.md --output-file ./README.md && npm run documentation-add-assertions","documentation-add-assertions":"babel-node ./src/bin/addAssertions","format-json":"jsonlint --sort-keys --in-place --indent \"  \" ./src/configs/recommended.json","lint":"eslint ./src ./tests","test":"mocha --require @babel/register ./tests/rules/index.js","prepublishOnly":"yarn documentation-add-assertions && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.0","@babel/eslint-parser":"^7.16.3","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.0","@babel/plugin-syntax-jsx":"^7.16.0","@babel/plugin-transform-react-jsx":"^7.16.0","@babel/preset-env":"^7.15.8","@babel/preset-flow":"^7.16.0","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.2","eslint-config-canonical":"^32.15.0","eslint-plugin-eslint-plugin":"^4.0.2","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-flowtype":"^8.0.3","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.0","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.27.1","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","gitdown":"^3.1.4","glob":"^7.2.0","husky":"^7.0.4","jsonlint-mod":"^1.7.6","lint-staged":"^12.1.2","mocha":"^9.1.3","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","@babel/plugin-syntax-flow":"^7.14.5","@babel/plugin-syntax-jsx":"^7.16.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"a4c1c04e3ba21c88e9087927a5b5a303be7d38d2","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@1.0.0","_nodeVersion":"14.18.2","_npmVersion":"6.14.15","dist":{"integrity":"sha512-UfoPUZYHiLlYJAadeTM5yiPwYu78Oin0x9nLV6lOqzjxmy0Y6nG+Nc69RSsY8WyzUCbgx4o2YZz7+kdemUqgGg==","shasum":"d118386be32f985587e5e1ba6e0d9196fac90722","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-1.0.0.tgz","fileCount":86,"unpackedSize":336763,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJht6zmCRA9TVsSAnZWagAAi54QAKKnoPjI8wJPwKM6G5Dt\n3nLWr2a3aeUtyYZ2QPANka7PE6hSP39V6MK2y2Muy44M66VCXUVMLXybLIy2\nA80LLghK9DILupIQvENPXAO7+0KZUf+4p5X8jlQugej9zGNeBjQQitvhfcH6\nhaCJ5tFDjSkKGGgErKuZ3enO/2Qvx3ny6MEtTcZPlZVkHH2ahvFnaN150H9/\n9tK3JYvQBWwtGHrIzmWA8zxYZwxIBpSRDbDffnu8Wc3kkDw679vjZz+ksEdG\nck9BmRmfmuhqFhBks3zaZYGiTkvAuuDsYWwcEt0d84W518+UoBQAv1zuwaji\nGLsxWr7di5QEFlpSdoy92bOfjKSzqg5LoNCfsuKl2cluTXGgscAwMnSvrSya\n88KwDyzE9R47Hrh+k+iOCdpvl01BSmW+VsSsHnI49onRWB58GwaPtlqJXyJ4\nWMGDOmAjepRJvF259NJiNs9J5WwpsVpdAHbfMT+xipmVhFUHzmmFLfjtT9fi\nD3uuX5RP3x5xqRmru9Bi7rYYxI4THfS2gmAb+q8DRyzWbeV9HlsDU/+SFP0b\nI1K9cT5y2z3GT885t91o8qtZUjpGx3X/mpIrsKEMycVcBEg9IE3CTrn4uJrr\nI0U3sc/y+BRLlTdnz3fvFHMH5sdyEIloDKwbgzYn8dRmA7CPvISUQrJUBcHJ\nTZzW\r\n=CDTB\r\n-----END PGP SIGNATURE-----\r\n","size":56726,"noattachment":false},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_1.0.0_1639427302570_0.23365050323605385"},"_hasShrinkwrap":false,"publish_time":1639427302732,"_cnpm_publish_time":1639427302732,"_cnpmcore_publish_time":"2021-12-18T22:37:06.901Z","contributors":[]},"0.1.2":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"0.1.2","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.0.0"},"scripts":{"build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files","check-docs":"babel-node ./src/bin/checkDocs","check-tests":"babel-node ./src/bin/checkTests","create-readme":"gitdown ./.README/README.md --output-file ./README.md && npm run documentation-add-assertions","documentation-add-assertions":"babel-node ./src/bin/addAssertions","format-json":"jsonlint --sort-keys --in-place --indent \"  \" ./src/configs/recommended.json","lint":"eslint ./src ./tests","test":"mocha --require @babel/register ./tests/rules/index.js","prepublishOnly":"yarn documentation-add-assertions && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.0","@babel/eslint-parser":"^7.16.3","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.0","@babel/plugin-syntax-jsx":"^7.16.0","@babel/plugin-transform-react-jsx":"^7.16.0","@babel/preset-env":"^7.15.8","@babel/preset-flow":"^7.16.0","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.2","eslint-config-canonical":"^32.15.0","eslint-plugin-eslint-plugin":"^4.0.2","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-flowtype":"^8.0.3","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.0","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.27.1","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","gitdown":"^3.1.4","glob":"^7.2.0","husky":"^7.0.4","jsonlint-mod":"^1.7.6","lint-staged":"^12.1.2","mocha":"^9.1.3","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","@babel/plugin-syntax-flow":"^7.14.5","@babel/plugin-syntax-jsx":"^7.16.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"7cef4f88caa89b25367baaeb8d5f1809e6b6e776","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@0.1.2","_nodeVersion":"14.18.2","_npmVersion":"6.14.15","dist":{"integrity":"sha512-bD0jlrffPwNTZnHpZebuLvd+2dDqIDuIvAzMaiBrzVG7MKTZNpEoF8sSIfg5Ed4ZN5iq3snLJJXEGB51qFXhxA==","shasum":"8b07d37d0a2a043180acaf4631c05abec5284924","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-0.1.2.tgz","fileCount":83,"unpackedSize":329256,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhtEMnCRA9TVsSAnZWagAAT1UP/iImVAenNZsFw41cKhiP\nhFoVg8WCGJB6USy5VQEeJLI3Y5tldVDj0eQxy3Ea/HCV5HgDNtyUN16LhZsY\nclYwfYeCy3p5gndOhYjLlv8hPhJQvaCyrF7MrJdEte8do482pCDp+CQlEMGi\nBdLK6OBA9iUyzXs7FuCe2b2A0QHGl249Udlkrazb1DtegcZqZCfVkaOdbBMJ\nFWNp1GxZlmPyZsq1tWtvUfsI2NYIOMsJ3fDA4BsyYb6ofMaTOGb7JZCjKyNv\nFkrEM8LCY8FCXjUKBfGqE91Mk/+i/45V2hxQQgu4wtUomdfKlp/ITknqeRIM\nNQccopkp3srBQBTGoW/q+EmfnjLgWMkAXwVWrlaG36TznFxqXgedQUZg6Lnv\nm/cYBeqGQo3bcKT+8bfOHbLQBkZTDKzQY3vIxv1oqVpdzQJYqyV+wtBD15y2\n18d3BqQpyYD2Q6CmA7A8n7Nz3elNQu1Vxo8aEybcm0OYzUU4FP3+Pusn69OG\no2dXaEikABEdXCwmXnMsiGak8Vi+SsyqR3/JZlQbESXtZHCJTKwgZjNqNzrv\nzW+OKl54aiqlhdbh+1brJSRpvnSLbG6s1gaDg07NTvdwgHIHO5GnCLNAa3yq\n4V2jKqlFkCy0OvZkReRV1dIT3mrDsoZ1muT5Fm5FhIbEVkYCvgQuXOkOH1rK\nYM2o\r\n=I8JE\r\n-----END PGP SIGNATURE-----\r\n","size":55224,"noattachment":false},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_0.1.2_1639203623665_0.4226020671349222"},"_hasShrinkwrap":false,"publish_time":1639203623848,"_cnpm_publish_time":1639203623848,"_cnpmcore_publish_time":"2021-12-18T22:37:07.117Z","contributors":[]},"0.1.1":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"0.1.1","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.0.0"},"scripts":{"build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files","check-docs":"babel-node ./src/bin/checkDocs","check-tests":"babel-node ./src/bin/checkTests","create-readme":"gitdown ./.README/README.md --output-file ./README.md && npm run documentation-add-assertions","documentation-add-assertions":"babel-node ./src/bin/addAssertions","format-json":"jsonlint --sort-keys --in-place --indent \"  \" ./src/configs/recommended.json","lint":"eslint ./src ./tests","test":"mocha --require @babel/register ./tests/rules/index.js","prepublishOnly":"yarn documentation-add-assertions && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.0","@babel/eslint-parser":"^7.16.3","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.0","@babel/plugin-syntax-jsx":"^7.16.0","@babel/plugin-transform-react-jsx":"^7.16.0","@babel/preset-env":"^7.15.8","@babel/preset-flow":"^7.16.0","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.2","eslint-config-canonical":"^32.15.0","eslint-plugin-eslint-plugin":"^4.0.2","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-flowtype":"^8.0.3","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.0","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.27.1","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","gitdown":"^3.1.4","glob":"^7.2.0","husky":"^7.0.4","jsonlint-mod":"^1.7.6","lint-staged":"^12.1.2","mocha":"^9.1.3","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","@babel/plugin-syntax-flow":"^7.14.5","@babel/plugin-syntax-jsx":"^7.16.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"e05842f04447710f47642b9bfa77af864517b134","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@0.1.1","_nodeVersion":"14.18.2","_npmVersion":"6.14.15","dist":{"integrity":"sha512-pidqQxJdN9jBinyFJh2pgWdId03CPhbcLCYP7OHo5DwCsLKRwlF03NTLy2VEHkf/vWz6wLmoCvTdampObXDA8Q==","shasum":"5e76160495f4b8e31cfb9a3b44ed8c7f12cfe549","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-0.1.1.tgz","fileCount":83,"unpackedSize":330446,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhtEEoCRA9TVsSAnZWagAAg+AP/inEA//Sd7Bb0yJ+AyVz\nMtDe+BNFTvMC2j1EDMi/VqVlWxPOChT7XFK37pEVOET4xo08hIgqauhIFVaW\nURINWhYmJERHzIurY2jHmk/ZIvoN2h62NSSlutC+QngqXNM42QL3KR//P9Th\n0YBK6PFPNeFR1bq3O++Wz8OWf2zQUQJNI4fdGN2lgQYopPQIbEQPCuuy5KLK\nc6P+9qp0vpkiWhvBRuDVEvF6XGJW8BpTowxOWVeAUJw3Xu5X87K1pEtLDzkj\nU/JO/iMBrPbe0gA8mBcpWo8/BUOoa/ohGq6sIcfpctqgNHV0U2HsXvMpZjfs\nkbGM6Lf99RMXSDJgMJdDsAi1+OFGXx0EmtOHop5XB44C+K/HjkPEFgJEeXAx\n3K3egifMsUAnd8OX6sG/QWIlxniKESPKE/HW0IMzI0CtXLiJGYMrH9u2qxl5\nfHW1f/FLwUUQvFBCA8zc8XczkEeyG2GPfMoCJkcRcVAl+O16narMOX148gJc\nbPmewhCXANYjawjLZ27AFFUkiJ1owFmIEtiBbG119fCOTTR45Y88MxMKioRx\nFL3VNZSC4OleZyacYjfVWLZ9uXkf600wRHeUxUBYhl5aBXkha3dxSbMbiVsK\nHTezWy0IRB80TYXu9PzH9WmHwyPpdMbuPnkniQuqD6rXDdzR21471uXS7lZV\nYwvm\r\n=eEMO\r\n-----END PGP SIGNATURE-----\r\n","size":55327,"noattachment":false},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_0.1.1_1639203112232_0.10338215360721081"},"_hasShrinkwrap":false,"publish_time":1639203112410,"_cnpm_publish_time":1639203112410,"_cnpmcore_publish_time":"2021-12-18T22:37:07.313Z","contributors":[]},"0.1.0":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"0.1.0","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-flow-type.git"},"engines":{"node":">=12.0.0"},"scripts":{"build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files","check-docs":"babel-node ./src/bin/checkDocs","check-tests":"babel-node ./src/bin/checkTests","create-readme":"gitdown ./.README/README.md --output-file ./README.md && npm run documentation-add-assertions","documentation-add-assertions":"babel-node ./src/bin/addAssertions","format-json":"jsonlint --sort-keys --in-place --indent \"  \" ./src/configs/recommended.json","lint":"eslint ./src ./tests","test":"mocha --require @babel/register ./tests/rules/index.js","prepublishOnly":"yarn documentation-add-assertions && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.0","@babel/eslint-parser":"^7.16.3","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.0","@babel/plugin-syntax-jsx":"^7.16.0","@babel/plugin-transform-react-jsx":"^7.16.0","@babel/preset-env":"^7.15.8","@babel/preset-flow":"^7.16.0","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.2","eslint-config-canonical":"^32.15.0","eslint-plugin-eslint-plugin":"^4.0.2","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-flowtype":"^8.0.3","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.0","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.27.1","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","gitdown":"^3.1.4","glob":"^7.2.0","husky":"^7.0.4","jsonlint-mod":"^1.7.6","lint-staged":"^12.1.2","mocha":"^9.1.3","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","@babel/plugin-syntax-flow":"^7.14.5","@babel/plugin-syntax-jsx":"^7.16.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-type","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"32a5b636bcd068cb5e262cdc6d156755c8e13ff7","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-flow-type/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-flow-type#readme","_id":"eslint-plugin-ft-flow@0.1.0","_nodeVersion":"14.18.2","_npmVersion":"6.14.15","dist":{"integrity":"sha512-EzaFW2aY5oNjbmSCeI9klnjHtxydxvBw0D5QFcTRPAX9Vyt3F8DbTlE34oVJ/sn2GKZou7U7/9KY1bo85exZRA==","shasum":"5257972eb25b862858451f4f24e4b73ff25e83da","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-0.1.0.tgz","fileCount":83,"unpackedSize":332047,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhtDx/CRA9TVsSAnZWagAAr7kP/0LargcsOhSaGf6Yhqsg\n2vc0TE8vqJc80EB7F0J07AoM5lNevUNlK3ZHAZZ37+cj+da/xuLizvYLVr4d\n6YY5RNamSFCfEpKAtECLjSzu47HICG+3vc7/rVkajP/6IIFwSv1N1T7iUPo7\netZy+PyWxqEmjS26UHKEqij5Z9pVQBy6x49MnJJsJQD6/2h7f8Emw6e/KLJs\njkJLW0vrNOowUBfYdPRdJ7egl+03ZLTbX230lU0ZdgLTsUT2tpgueuPecYMq\nV8k9JL6Ifxef7AEZw+G3wJ43DTAHZTIsk0100irjFdfSHB2Xb+nwO3QeX+oA\na0O/LQaTRtL6DxOj0n3sTVIVBSGTqlx1AI0/y4PIQKFfb8twMILyYUuhSNy1\nK0Wo4treAiUVyyh+5/YYTcYlHu2gOp/IqT0/yJiOxb6x6EC50EaS4t2SoJj7\nUeyVozrUqSS6QItIwTWnv4RN7cvdKLdvkZeBcGhzjSA8hk3DpL8yqUINYZYz\nYEnoFaJsnQK+SPsrXPJJ+oiv24sExWKoXZAMZsmIv4ef65iPqc6dc7Vb0TWd\nhrHEiTFMyLz6XaXQYGvH2hC8kZQR835B/S+/nM6JgeOZoalJheXH9/Pff3rA\ntzCJ6OBhO/ELyMA+pqGzAHt2rbD4Jbqb2VIinwa7unpYnmlIWtbr/uPImu4V\nSJwj\r\n=P1QS\r\n-----END PGP SIGNATURE-----\r\n","size":55352,"noattachment":false},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_0.1.0_1639201919324_0.6179356567114271"},"_hasShrinkwrap":false,"publish_time":1639201919552,"_cnpm_publish_time":1639201919552,"_cnpmcore_publish_time":"2021-12-18T22:37:07.540Z","contributors":[]},"1.1.1-alpha-0":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"1.1.1-alpha-0","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint ./src ./tests","test":"mocha --require @babel/register ./tests/rules/index.js","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-syntax-jsx":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","glob":"^7.2.0","husky":"^7.0.4","lint-staged":"^12.1.2","mocha":"^9.1.3","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","@babel/plugin-syntax-flow":"^7.14.5","@babel/plugin-syntax-jsx":"^7.16.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"ecb3ef1b7ea50a473a78b58fef77e7bab390aeaf","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@1.1.1-alpha-0","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-oTgz2MI5IbU85KhfoqXIIK+PHAe4LWg0oMwfEvnQwh5Xtp2MYBAIYffsQS2JQhxsfeqkxgLf+Pv+J586N3UU6g==","shasum":"8b9374c8c4a8268408878664bcbeff3653da429d","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-1.1.1-alpha-0.tgz","fileCount":82,"unpackedSize":325041,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhy/LICRA9TVsSAnZWagAANIMP/3EfGcRSiD9pL8y6eIJm\nMzKCi15WlYDEdLtJPr9CVPxymFNqkZ1Zn9xChTjLWn/SeJirr3Hq9Y+fAVfL\nGuDUMCY9f3FJz7KKVfPPBgZkzXJTJbnT7HvAQE+Jzug+0ZjSKvasPyzwSTXR\nYBymWuN9C9Mqa6g89aNEYwmDXmQ96xX11N8bgJilpphVfx8Gexoe0CWUl/wk\nlTfVUcT7bjd1FuwlDMxEuyE3zKBrc8fIBY6/4lYLacHGHpssL31VUxSLfPkv\nE/8jzsIZ6zcc9izjNjMSSB5KMlEG+izioDY7pJvDJMg4auAckqJs+VCQN8C9\nrNNKIiQLdSybXYhXeth736eRNFoMyvLabJZf0IHco07BQUeojy1iNHaQCpG2\nEYq+dU8BXN96sR+EowsFtQqvxyvZMDB90qpU8SKhA7HyPVmCSgTLg1FlaAXe\n79qaS74mfaXQ1t3A81uhdNqVO14+N9qgFpHteSCVSlU0LSM2/AnybtBmKhSb\nYsnHVqz8wntjDeSAitfoBzc5AMFLsexjQbx9jXsRZTlgvrrHRR9+ePN6TZ7D\nxMRj2umsv736Qf/xRsgF0LvQarAUNv8UfFXJ2fSTP1SRmYnhcDS+TLGsN337\nNpODlVbNFtmwW2XzzSMZ1gTh3IXrcq8JFD82e/Db5lElHubDbRqKgggUx6mK\nQ3Tr\r\n=8xF5\r\n-----END PGP SIGNATURE-----\r\n","size":54520},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_1.1.1-alpha-0_1640755912823_0.7768287204948512"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2021-12-29T05:32:00.522Z","contributors":[]},"2.0.0":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"2.0.0","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint ./src ./tests","test":"yarn jest && mocha --require @babel/register ./tests/rules/index.js","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-syntax-jsx":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","glob":"^7.2.0","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^9.1.3","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","@babel/plugin-syntax-flow":"^7.14.5","@babel/plugin-syntax-jsx":"^7.16.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"7786e3b9828b92896481c038d508d0aa11aadc04","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@2.0.0","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-W9/PDbph5xImmrarHPiUYO3GqDeCPegdrONjJqr9Qrdy7UeTOEetcfy6yaFputvvUrchFsSMNV2BM2hiKaEJ8w==","shasum":"c74016ef0840c7ff9d57ffdba3b353f9daa9711f","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.0.tgz","fileCount":83,"unpackedSize":325265,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhzKiUCRA9TVsSAnZWagAA3vwP/j6tWJZuWhXMya756mKF\nxczXTpepUHQ7kO30rVkoqRN3dJuNKi7EBhzVMvW59EQS7ZnbPTFso2Z00TEI\nvmVXUKZcv2f+6Ypruy0Yu6/cRHH/4/XThzTFQlLH7aT1IB3FDoITeQJoXRaL\ndCpenkQSfbsUK/KRvUFNNPEhbBrZogM+gigg6MSgLRXBLvqSJzhOxWT2QQFx\nZ+mLNFmeG9BsrcLzShx5CEE4XHyirXelQGPz2MfkhzykdRu/UONECiheWnTS\nkCGZ1TaPkJ0/XjLq9Mfvm2vSGYhyHuQGyDwoDhbybZzq5H6girSygUwq2CC1\n6K6zLD6FONtX6+7b72mj9KomV30NkyDrJ4E5Bgy229VWc3nAkRsbQBMTF4Km\nTZWE5fhkFSxbem4smncfo9AJxN9ycSV7NQ8rw4h6w6UrCoxW7ewQWZEhJSrQ\ndiJFfTf34QW8WBIFp+wO3dDomUWyopnrenHxH79+o/Tw6BoNyyVEt1rlyVu6\n+DoIG5dli6r5HjoRX6qhfRcBTETHIvFZKFX7t5t6L+dnM8vvgKyW+w1HHKsC\nPuyXgdA/j9Yd2DL1P/a5mmiJ8fc1r5t9jB9BafCfsezDAwuLvizfAc+Ufx3R\nLit5IQiDkN89QsY4cyg4XhdTB8bCy9abWg6+/rFqfyhUqKQzkrXNZLqMJ5iD\nQ+nO\r\n=B6Mm\r\n-----END PGP SIGNATURE-----\r\n","size":54633},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_2.0.0_1640802452608_0.45771910466344323"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2021-12-29T18:27:42.557Z","contributors":[]},"2.0.1":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"2.0.1","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint ./src ./tests","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","glob":"^7.2.0","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^9.1.3","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"a0c758094d2c388330239a798fee26b04534a8c8","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@2.0.1","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-dGBnCo+ok6H9p6Vw2oPFEM4vA9IEclRXQQAA/Zws51/L5zr3FDl9FxQiWGfaw0WaTIX5biiAxp/q1W5bGXjlVA==","shasum":"57d9a12ef02b7af8f9bd6ccd6bd8fa4034809716","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.1.tgz","fileCount":83,"unpackedSize":325236,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh2MOgCRA9TVsSAnZWagAAf3AP/iDuHTtkdOaznED0M4tM\n+tOs4TA2otUaGig5N6+vQHafBFvlOmmWQMqrw+EZeCIEuzfkh8HEROoCNdsR\nIhWg0d3PmQDStMvcUL7KSGJdPtxqow5EKVWUrIpwZFr76fTNOBTK9Yueq0xd\nKxbn2roHiSN2Jknf9fcM8Puq7DK40/RzGclFQn3QZxXEz3o80dIafJTozUfr\nQLttVQyYqXaSfGi/Nry4C2Px0d8v1VxLAGptUgvIKddBJpOXxdOtLYWSlA3O\n8OIAyEanP+Ir6rvldEUj++YIdwD4OGxI8QUXINc9xGM1Q0STrbkLKq6NhA0S\nuWUPj5x3OARvkbJxqw+3sPMjJSVNsKt711HWRspKhO8W5VoKuXFSHBuhUPWH\nnh4d0/c70S0qCPbrALKyLy7fPc8b8vpEylzVjoo48oFJuPDMX6y7vH9vyD7G\n2tTH75bGRuJ0m6s3PYNwSGDH3Z/yOU9DrvrCx57RfG9jQsnWziHE6VkTFnfu\n/bS8J69dDaGYFNQIXVrdvQ6NoawQFULdNwSL/KZr0hmiV3hoWIHOtXvbrAwj\nCPBSbPrSbo9XUitelV2DwRgpor5dDbVaq7GgzE4/+zwxNwCVcNOwTS10yVqX\nMV4f+PDJm5W05PNiLcCqKf3uLXxxGukTrRbb4+fpge0IWER8Le8VJoiTdFhG\nSGIo\r\n=GS21\r\n-----END PGP SIGNATURE-----\r\n","size":54756},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_2.0.1_1641595808759_0.7909528949302651"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2022-01-07T22:50:19.220Z","contributors":[]},"2.0.2":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"2.0.2","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint ./src ./tests","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"ed04627c402c56936b1b884195d63e1f9fe0b6ac","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@2.0.2","_nodeVersion":"14.18.2","_npmVersion":"6.14.15","dist":{"integrity":"sha512-C257b0PROV3SU+AJmMzeTRV0MNrtPgpHQPKFg+msZxeYLd6zGjctn/raR4JxY0YXr8eC42m/qoL+65RKaZ+ujw==","shasum":"1d2fe83f782ecf2c370a6e2a4c8b1c26279f4b42","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.2.tgz","fileCount":161,"unpackedSize":505466,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHhmvz/vGwwIC53Ikh/CCsV75NeCERPU99Rnzk+x2izAIgdMfkYF5ps5qn56uBnMsg3Ajb60dJrh63Tz6wiKdZlqk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjcpEEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqbJQ//fpaobmU08yoaOy5YMb4QYTz4iaPYTSXdMoRqk+N2lS+XikIz\r\n/vM5Wcq8+ZglVdvrFZoKTPRRbNxfr9X7RIyoRMM+bUXWhoO7LSird0PEhoKX\r\nq/Bg9n8kVykCp2mVCPYD1DfGIMlulSGBdv+j2JO4kwW1OSsOrJrkZe/Fuyje\r\nFy9ydNZ+lrvJF+Oa0bq/TsAgvYRnkMaIRj6q3L+Az7r/6FFm9cQlPhnUl8yG\r\nLsSQQZMSvcynnKFdrd2IfQV9IqPtDBztaGRIXerLGmTLAyjP6hp8m1UAeWdl\r\nGevvMdpR0Qb5IVVh48KH5mm+huc2mbtoyd58perkCifs3OzqpEFLpEF9rOof\r\nQeLX5+I4JuY4Ob5jkJSpHtb0XVlcJyZvGbKf3LDGFuGXOVBdOfRzqsS331FL\r\nYljeGm+DQyDKOctdAM9kJnvDiYzyFLjQQdTUi+NnOx5ewN6brnUIbNt/v6sF\r\n2mtGaecE1F/0KAdS43F7ZgfxpbVhJyzWI8CwzCLkTKIszI5Extat53Qbat64\r\nZz5e3s9DrtfIl0iDM4eRnQkj0s9wU5rjjsmRE/QhgY1MHoxA+DbdAPWl/F+C\r\n8iMoIo4+LoZtdNZ1rNdMQspOeyz6g4ulwmIQubw2415irD5gw+Mdl4QCmT23\r\nRRmYy5CLHaCQVSEQqu3VWvYpxRw/ANNs34w=\r\n=xAxI\r\n-----END PGP SIGNATURE-----\r\n","size":89639},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_2.0.2_1668452612135_0.8837720618528468"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2022-11-14T19:09:28.792Z","contributors":[]},"2.0.3":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"2.0.3","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint ./src ./tests","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.4.1","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"@babel/eslint-parser":"^7.12.0","eslint":"^8.1.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"1452f5ba8794bfa8711c37a2e895eec8f1c11984","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@2.0.3","_nodeVersion":"14.18.2","_npmVersion":"6.14.15","dist":{"integrity":"sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg==","shasum":"3b3c113c41902bcbacf0e22b536debcfc3c819e8","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz","fileCount":161,"unpackedSize":505466,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBcxrsUK5sJKAN7TS86nPpv3O3XdpN8fm+Uo0akazYiUAiEA3hZcxc7YaEklIqELDcBsqRO8vWR9dJqAziD1YjdhJAk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjcpGIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoaVBAAm4XnqglGDIgDouamK6xdA70B7Da+iOKmULsAnbWfGwESvWhf\r\nZxsrkSKVWNbpI4vKA4wZIfqTmB9+BqD79hVKNXY5rcZWITHbij/idShMMBlG\r\nwkPcS5cZumjomi99auZO0Is9xqqXRKKK065wLTTfbCjjLj4GWp/QF3IYKTnG\r\nwMYeZljQjB7gb68ZWqo68RAB0XHC3UVy72Piq8QfWCQ9cR8HRg1XtN5YVqmd\r\ncdU0jUFrpoDmKbY4zNAMF46hngIKYMRk4j2bOOH283CcfXTI2IafY18rQFWL\r\nbRSU02kFGeQFDYy5y0JtUHphN1ieW36+PXsbSlL/Pm42sNNH5pzvvsjHCcsy\r\nCOGICrGWa7WQRwqMFbSvz761scFo2utUPlDqQYr5NQtMaknQOMWQTTjITCc9\r\nuDp0Et3CqYkBjIWPeMO0ScZhixMtjWU8HM2fqMVRFSWbWL3KAmEoVojYqP4r\r\nHfMsLUhV4qlSXwgjGXLc7CpsmoYTDv4us0g0hOA8OCbykhNUT7lEW77ZbG8/\r\n/2B3A6LGPGArpIMidSu15AYgXsapcjlqnA6T2yS3HEcYVctpvfRHRooRPON9\r\n38MzGu3e8yk6gwKlfZ6D5WbHi+DMFI0/x9JB2/j35oiufh15SawLhapBNES7\r\n39zbvygk0TlhIxLJ2FsTPpe1yhwyz0WPUfc=\r\n=FBpm\r\n-----END PGP SIGNATURE-----\r\n","size":89640},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_2.0.3_1668452744239_0.17794845817043936"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2022-11-14T19:09:30.009Z","contributors":[]},"3.0.0":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.0","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.46.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.15.0","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.1.0","hermes-eslint":"^0.15.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"159088ad77743892418147ecde8955126487d0d8","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@3.0.0","_nodeVersion":"16.20.1","_npmVersion":"8.19.4","dist":{"integrity":"sha512-fz5ep5V2jh5aNBHoCKOdq+xxGenxYMfmOq8F6MUnFGyeEncJgV91O7mOWyKTZN0h/ofP+yW1CS7fZq8iEglNxw==","shasum":"e9cbe4531089c2a85726928baa2d30d24d9af3b5","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.0.tgz","fileCount":162,"unpackedSize":508282,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICPDKtEgmHQab4wwCDwexclHBL3ICqmGaVhYyw5Q+KbSAiEAoanVlwgaPj4+w3Sn9Scq3KyrURrkqAKB7Wgafl/HYD8="}]},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.0_1690627351259_0.97470358650641"},"_hasShrinkwrap":false,"contributors":[]},"3.0.1":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.1","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.46.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.15.0","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.1.0","hermes-eslint":"^0.15.0 || ^0.16.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"fe34ad60cfce837b7fe1ffbeb9196a55994d3c0f","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@3.0.1","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-SB6gWDisy2hdYFWimK3fXOKOmi16pIC06R9mCGozHFs6jyr5yi9RDMSGiNuZdBJh1mw2YSF+l7a5hd8ykRQ/Gg==","shasum":"a0f39cc35efff1a369829e5ba1b528ba0524b371","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.1.tgz","fileCount":162,"unpackedSize":508293,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDHub3nbVQgRL3/CWGQB3uFv9bchyu5JELqL0i6tenwRgIgPkAHDnPlrgCG6QNtlcijhMg9usr/D6L+ifjB8gnuW8s="}]},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.1_1696963954749_0.6258349023089878"},"_hasShrinkwrap":false,"contributors":[]},"3.0.2":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.2","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.46.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.15.0","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.1.0","hermes-eslint":">=0.15.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"904a3cfad4db5478d151a8147990fbaf023a7a76","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@3.0.2","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-Dr/RT5FZuxi5sd39vWaUXZj2GrOCHFwfB9zILSZmZ8PFS2C9M2fr7ReJjdB7wlpHEjartL7PYpmoI2c7Q0csMQ==","shasum":"740f7a08836d112497fe2566a25de6c6ad0233a1","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.2.tgz","fileCount":162,"unpackedSize":508758,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICZeTocWd3L4vqtqhIrpEr85t4ZKGyCrwCd9Daq7yghdAiEAkmYj3HLbCIvl8LN+NPdGTTnTir2A/TUHjMl6t4FTm4Y="}]},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.2_1702976348900_0.29533222792373737"},"_hasShrinkwrap":false,"contributors":[]},"3.0.3":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.3","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.56.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.18.2","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.56.0","hermes-eslint":">=0.15.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"aea92e5b242faf7d5e77a7d486fdcec9169993b4","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@3.0.3","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-dym24KLcyCZWMv3bKvDRFJeqs4cijIyp9Ld3Ip8/hM8dQUgEU8SKaVhYllO9EvNqF2eWiK1Bb84ts3mE1lr3ug==","shasum":"6d8f41b5f06c00bb1b59b3a09d902799b7ae3ccd","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.3.tgz","fileCount":162,"unpackedSize":508136,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCdVNdf8l7Z7D5lfPo+8UEqt93eoI99gYKsxS8UqJ17VAIgZ/0W3dBYmK2YZMhiOVz+YBSbRNDhsxurAbEmSw1WmAA="}]},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.3_1706398202278_0.08552434941513587"},"_hasShrinkwrap":false,"contributors":[]},"3.0.4-alpha-0":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.4-alpha-0","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.56.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.18.2","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.56.0","hermes-eslint":">=0.15.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"7f4e9a0768570fa04de752937f44d0699c132496","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@3.0.4-alpha-0","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-GsWyrUQQ1So0pzRnZOV2pfAp0FLsCABnID7a8Kd3sJWr+Py2AubMR+Jx6mF97Dg2PGq48eCQjUaaT84wGN1dNA==","shasum":"72616b7ee59c9e6b8dfef56a491b9e85baaf4d3b","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.4-alpha-0.tgz","fileCount":162,"unpackedSize":515532,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIElJnghlo4q6FHchjOH9kbEN76VQ3p5Xz7YJYXqXWz1BAiEAq54zLfSet+osO322IZT/1mXSeFpspMlBvlcdeKUw/w8="}]},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.4-alpha-0_1707081516855_0.7444827028383527"},"_hasShrinkwrap":false,"contributors":[]},"3.0.4":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.4","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.56.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.18.2","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.56.0","hermes-eslint":">=0.15.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"edf6c2e6d47ea08aa002bb39d3102d9de4abe3f4","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@3.0.4","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-afH0HSk5BPbnNFE8G7aNzTK+DQNgAA3/xZ6wSxYexmERo3iBFiYtWpd8QoPa4xwxnC2Us5bJTA1AGSlkJfkHBg==","shasum":"cd19ead98c03e39aff186382edc5bca3215d359d","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.4.tgz","fileCount":162,"unpackedSize":507799,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHcZP/aG939JvQ1cFgY+yqpSpGztAZ+pehWiR9vZ3CXMAiAA7BabGPYd3lQIOKM23og6lBQIdTJEP0HZnM0c61w7RQ=="}]},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.4_1707614320940_0.0409956890605534"},"_hasShrinkwrap":false,"contributors":[]},"3.0.5":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.5","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.56.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.18.2","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.56.0","hermes-eslint":">=0.15.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"74bc4947f9503e44c1b62455153b3ec42b158901","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@3.0.5","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-owZMmncrI6m4+ypPoGRAFZY3SGcJ+9tFSxeR/aTHTXm14/BWVRqVVeg8fc+k8Ljbfv7dhe+FY4ZVBjgLBV/Ndg==","shasum":"388dbe89466b862f60940aaef3847531f88c13bf","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.5.tgz","fileCount":162,"unpackedSize":507845,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5xgKcGHrTrfhZEXeopi/NJShYeWad9ZN4+rp/zW8sHQIgTIo8kUgy27OGIkWtcidy9Pr7oxx1I5LlioANxifhKvE="}]},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.5_1708032755326_0.3879804845569945"},"_hasShrinkwrap":false,"contributors":[]},"3.0.6":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.6","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.56.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.18.2","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.56.0","hermes-eslint":">=0.15.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"df0d78ce3260a43aae5aa5dd0e2bd3dbcaeebed6","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@3.0.6","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-+MSoUgOOUTiabz5WVCuQw0A0sIGatpSzJBdSC2dTaTNQ5TKN6leq5SdoQeiAYkbtKbHag3KuQeoRLueqLmkCQQ==","shasum":"0ed968e675e0cf849198ce2a2d1c6346b312a528","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.6.tgz","fileCount":162,"unpackedSize":509981,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHMBEJ/ztJkVtn5+z7qLcmzpxXKFaPOIFHsUeKqfvHd+AiBBp/I4/xvCIQVp038JMTeIzRTnUzQIMJ5LK3UQm8j0xw=="}]},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.6_1709327431307_0.9063842402628073"},"_hasShrinkwrap":false,"contributors":[]},"3.0.7":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.7","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"engines":{"node":">=12.22.0"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.56.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.18.2","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.56.0","hermes-eslint":">=0.15.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"gitHead":"9b699fd3d8e17f315652692a50486ceaa68d566a","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_id":"eslint-plugin-ft-flow@3.0.7","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-XeoddFsrqhEnp6vp+7ndQVPH8qTRiflgcDaQujv7WjVgGAdBbG8osWhRFcg2u9aQhz6Y+egBUL4+oTS0n6IfUQ==","shasum":"be0f53d5bc3a39bdd10e99a02936275f469d6936","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.7.tgz","fileCount":162,"unpackedSize":510634,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHYOef76ccaP6cTHZFEoQi8WGgjCmdXD/q4Vp5hJXaXcAiEAwiTd13Q0tizxnWR2VtsCXX99Q+PCTHDBUaNC3x09zdQ="}]},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.7_1709420337473_0.23876603949405828"},"_hasShrinkwrap":false,"contributors":[]},"3.0.8":{"name":"eslint-plugin-ft-flow","version":"3.0.8","keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"license":"MIT","_id":"eslint-plugin-ft-flow@3.0.8","maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"dist":{"shasum":"0b66b97957413277530d455e63f2e4e2c5151f29","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.8.tgz","fileCount":162,"integrity":"sha512-snPVyIL/3Ck3mqqOtexwu+rsmNdeSaYFZXT2nlwCDQXJ/LHtkYzsWvoEF06WdQiLPRvqDgia8LG5RNFYeTn7yg==","signatures":[{"sig":"MEUCIQC+HCPD4qJBJ2udrNaEhGKuvBtjPGcDhWKp+qj0QKv9YwIgDmW1bITGW9F0I0sEOCtIaoCgum2ZWaXqMVxNjb69blk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":510738},"main":"./dist/index.js","engines":{"node":">=12.22.0"},"gitHead":"b9def791f888019dfa2204a55a2890dc780135bf","scripts":{"lint":"eslint .","test":"yarn jest && yarn test:rules","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","build:flow":"flow-copy-source --ignore '*.spec.*' src dist","check-docs":"babel-node ./scripts/checkDocs","test:rules":"mocha --require @babel/register ./tests/rules/index.js","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","prepublishOnly":"yarn create-readme && yarn build"},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"repository":{"url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git","type":"git"},"_npmVersion":"8.19.4","description":"Flowtype linting rules for ESLint by flow-typed","directories":{},"lint-staged":{"**/*.js":"eslint"},"_nodeVersion":"16.20.2","dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.6.3","glob":"^7.2.0","jest":"^27.4.5","husky":"^7.0.4","mocha":"^10.1.0","eslint":"^8.57.0","rimraf":"^3.0.2","flow-bin":"^0.167.1","@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/node":"^7.15.8","lint-staged":"^12.1.2","hermes-eslint":"^0.18.2","@babel/register":"^7.15.3","flow-copy-source":"^2.0.9","@babel/preset-env":"^7.16.5","eslint-config-bzc":"^1.0.5","@babel/preset-flow":"^7.16.0","eslint-plugin-jest":"^25.3.2","@babel/preset-react":"^7.16.7","eslint-plugin-react":"^7.28.0","@babel/eslint-parser":"^7.16.5","eslint-config-airbnb":"^19.0.2","eslint-plugin-import":"^2.25.3","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-jsx-a11y":"^6.5.1","@babel/plugin-syntax-flow":"^7.16.5","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-react-jsx":"^7.16.5","babel-plugin-transform-flow-enums":"^0.0.2"},"peerDependencies":{"eslint":"^8.56.0","hermes-eslint":">=0.15.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ft-flow_3.0.8_1715114300438_0.3736277763274267","host":"s3://npm-registry-packages"},"contributors":[]},"3.0.9":{"name":"eslint-plugin-ft-flow","version":"3.0.9","keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"license":"MIT","_id":"eslint-plugin-ft-flow@3.0.9","maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"dist":{"shasum":"d93ae2c8ee4716ff8a54989efa73cee81f40964d","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.9.tgz","fileCount":162,"integrity":"sha512-m3ZL33yntMILOA5jRxVtUROJxmvGQcIgUJnWqjC7QsQbU+KtntRLaBKaDb7NeUmRioDq+QgI1fdaAEFpOKitgA==","signatures":[{"sig":"MEUCIQD0Skg9SIZ3x1wI09P83UZ9IAa+3tCZwIxHvP+t3g7s5wIgO7AIf0bt2pOHDNWfjOYHPcRctuST+zPCCuPYZcBpiLo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":512216},"main":"./dist/index.js","engines":{"node":">=12.22.0"},"gitHead":"2c40812b931f56195d8b20877c2eeabf2e2d479b","scripts":{"lint":"eslint .","test":"yarn jest && yarn test:rules","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","build:flow":"flow-copy-source --ignore '*.spec.*' src dist","check-docs":"babel-node ./scripts/checkDocs","test:rules":"mocha --require @babel/register ./tests/rules/index.js","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","prepublishOnly":"yarn create-readme && yarn build"},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"repository":{"url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git","type":"git"},"_npmVersion":"10.5.0","description":"Flowtype linting rules for ESLint by flow-typed","directories":{},"lint-staged":{"**/*.js":"eslint"},"_nodeVersion":"20.12.2","dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.6.3","glob":"^7.2.0","jest":"^27.4.5","husky":"^7.0.4","mocha":"^10.1.0","eslint":"^8.57.0","rimraf":"^3.0.2","flow-bin":"^0.167.1","@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/node":"^7.15.8","lint-staged":"^12.1.2","hermes-eslint":"^0.18.2","@babel/register":"^7.15.3","flow-copy-source":"^2.0.9","@babel/preset-env":"^7.16.5","eslint-config-bzc":"^1.0.5","@babel/preset-flow":"^7.16.0","eslint-plugin-jest":"^25.3.2","@babel/preset-react":"^7.16.7","eslint-plugin-react":"^7.28.0","@babel/eslint-parser":"^7.16.5","eslint-config-airbnb":"^19.0.2","eslint-plugin-import":"^2.25.3","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-jsx-a11y":"^6.5.1","@babel/plugin-syntax-flow":"^7.16.5","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-react-jsx":"^7.16.5","babel-plugin-transform-flow-enums":"^0.0.2"},"peerDependencies":{"eslint":"^8.56.0","hermes-eslint":">=0.15.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ft-flow_3.0.9_1715116802103_0.8914053372205188","host":"s3://npm-registry-packages"},"contributors":[]},"3.0.10":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.10","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.57.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.18.2","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.56.0 | ^9.0.0","hermes-eslint":">=0.15.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"_id":"eslint-plugin-ft-flow@3.0.10","gitHead":"331d394adbe072fbdae0497fa8545e3e9037d648","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_nodeVersion":"20.14.0","_npmVersion":"10.7.0","dist":{"integrity":"sha512-DLILrcr6PiQ0TyxksTPezxrmYZAF5idKmSwNE0bF9qrf0mPT9fbzj0E4BXidB/QKnOmFn5TRq6cXoJjxqb+cIQ==","shasum":"28556f826db97a275991eb456a14b1cb4bbe02fb","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.10.tgz","fileCount":162,"unpackedSize":512217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDoEKtO0d9b3MDgYvrjFsH4hweW5inHs9SzQJ/ZJi424AiEAn/aeh9hrJDVNHc7nRGd6QA3HolTGYe80fJKuSwFb6J8="}]},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.10_1718499605132_0.616097966396363"},"_hasShrinkwrap":false,"contributors":[]},"3.0.11":{"name":"eslint-plugin-ft-flow","description":"Flowtype linting rules for ESLint by flow-typed","version":"3.0.11","license":"MIT","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/flow-typed/eslint-plugin-ft-flow.git"},"scripts":{"build:flow":"flow-copy-source --ignore '*.spec.*' src dist","build":"rimraf ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files && yarn build:flow","check-docs":"babel-node ./scripts/checkDocs","check-tests":"babel-node ./scripts/checkTests","create-readme":"node ./scripts/genReadme && babel-node ./scripts/addAssertions","lint":"eslint .","test:rules":"mocha --require @babel/register ./tests/rules/index.js","test":"yarn jest && yarn test:rules","prepublishOnly":"yarn create-readme && yarn build"},"dependencies":{"lodash":"^4.17.21","string-natural-compare":"^3.0.1"},"devDependencies":{"@babel/cli":"^7.15.7","@babel/core":"^7.16.5","@babel/eslint-parser":"^7.16.5","@babel/node":"^7.15.8","@babel/plugin-syntax-flow":"^7.16.5","@babel/plugin-transform-react-jsx":"^7.16.5","@babel/preset-env":"^7.16.5","@babel/preset-flow":"^7.16.0","@babel/preset-react":"^7.16.7","@babel/register":"^7.15.3","ajv":"^8.6.3","babel-plugin-add-module-exports":"^1.0.4","babel-plugin-transform-flow-enums":"^0.0.2","eslint":"^8.57.0","eslint-config-airbnb":"^19.0.2","eslint-config-bzc":"^1.0.5","eslint-plugin-fb-flow":"^0.0.4","eslint-plugin-ft-flow":"^1.1.0","eslint-plugin-import":"^2.25.3","eslint-plugin-jest":"^25.3.2","eslint-plugin-jsx-a11y":"^6.5.1","eslint-plugin-react":"^7.28.0","eslint-plugin-react-hooks":"^4.3.0","eslint-plugin-testing-library":"^5.0.1","flow-bin":"^0.167.1","flow-copy-source":"^2.0.9","glob":"^7.2.0","hermes-eslint":"^0.18.2","husky":"^7.0.4","jest":"^27.4.5","lint-staged":"^12.1.2","mocha":"^10.1.0","rimraf":"^3.0.2"},"peerDependencies":{"eslint":"^8.56.0 || ^9.0.0","hermes-eslint":">=0.15.0"},"keywords":["eslint","eslintplugin","plugin","flow","flow-bin","flowtype","flow-typed"],"lint-staged":{"**/*.js":"eslint"},"_id":"eslint-plugin-ft-flow@3.0.11","gitHead":"3f9c5e15c21659fe661a8d05e0320a6f975a821a","bugs":{"url":"https://github.com/flow-typed/eslint-plugin-ft-flow/issues"},"homepage":"https://github.com/flow-typed/eslint-plugin-ft-flow#readme","_nodeVersion":"20.15.0","_npmVersion":"10.7.0","dist":{"integrity":"sha512-6ZJ4KYGYjIosCcU883zBBT1nFsKP58xrTOwguiw3/HRq0EpYAyhrF1nCGbK7V23cmKtPXMpDfl8qPupt5s5W8w==","shasum":"64654dad277104fc45aef8d009c4a51057ea1250","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-3.0.11.tgz","fileCount":162,"unpackedSize":512218,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCaISXms3DREqIXz/MIGnb/i334Kt28pa5sx+ECLUYuPQIgZmQGPGEvlsHlgOtKOuh7dzQtebFUH9zPMP6rLaKWQFI="}],"size":89361},"_npmUser":{"name":"anonymous","email":"bzchen93@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"bzchen93@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-plugin-ft-flow_3.0.11_1720779171439_0.6566507436264832"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2024-07-12T10:12:51.802Z","publish_time":1720779171802,"_source_registry_name":"default","contributors":[]}},"dist-tags":{"latest":"3.0.11"},"name":"eslint-plugin-ft-flow","time":{"created":"2022-01-27T22:30:38.360Z","modified":"2024-07-12T10:33:24.895Z","1.1.0":"2021-12-18T22:36:53.267Z","1.0.2":"2021-12-15T18:38:29.388Z","1.0.1":"2021-12-13T20:39:52.904Z","1.0.0":"2021-12-13T20:28:22.732Z","0.1.2":"2021-12-11T06:20:23.848Z","0.1.1":"2021-12-11T06:11:52.410Z","0.1.0":"2021-12-11T05:51:59.552Z","1.1.1-alpha-0":"2021-12-29T05:31:52.975Z","2.0.0":"2021-12-29T18:27:32.784Z","2.0.1":"2022-01-07T22:50:08.978Z","2.0.2":"2022-11-14T19:03:32.311Z","2.0.3":"2022-11-14T19:05:44.424Z","3.0.0":"2023-07-29T10:42:31.455Z","3.0.1":"2023-10-10T18:52:35.027Z","3.0.2":"2023-12-19T08:59:09.094Z","3.0.3":"2024-01-27T23:30:02.475Z","3.0.4-alpha-0":"2024-02-04T21:18:37.061Z","3.0.4":"2024-02-11T01:18:41.110Z","3.0.5":"2024-02-15T21:32:35.627Z","3.0.6":"2024-03-01T21:10:31.585Z","3.0.7":"2024-03-02T22:58:57.716Z","3.0.8":"2024-05-07T20:38:20.633Z","3.0.9":"2024-05-07T21:20:02.306Z","3.0.10":"2024-06-16T01:00:05.312Z","3.0.11":"2024-07-12T10:12:51.802Z"},"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>eslint-plugin-ft-flow</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/flow-typed/eslint-plugin-ft-flow/actions/workflows/build.yml\">\n    <img src=\"https://github.com/flow-typed/eslint-plugin-ft-flow/workflows/build/badge.svg\" alt=\"ci status\">\n  </a>\n  <a href=\"https://www.npmjs.com/package/eslint-plugin-ft-flow\"><img src=\"https://img.shields.io/npm/v/eslint-plugin-ft-flow.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 eslint-plugin-ft-flow eslint hermes-eslint --save-dev\n\n# or with yarn\nyarn add -D eslint-plugin-ft-flow eslint hermes-eslint\n\n# or with pnpm\npnpm add -D eslint-plugin-ft-flow 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/*\n* @flow\n*\n* something multi lined\n*/\nconst text: string = 42;\n// Message: Expected 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// Options: [\"always\"]\n/*\n* @flow\n*\n* something multi lined\n*/\n\nconst text: string = 42;\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: [{}]\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: [{}]\n/*\n* @flow strict\n*\n* something multi lined\n*/\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: [{}]\n/*\n* @flow strict\n*\n* something multi lined\n*/\n\n/* $FlowIgnore[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 portions of your code,\nwhich would have otherwise caused type errors.\n\nThis rule optionally takes one argument, an object to configure which type warnings to enable. By default, all of the\nwarnings are enabled. e.g. to disable the `any` warning (allowing it to exist in your code), while continuing to warn\nabout `Object` and `Function`:\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/no-weak-types\": [2, {\n            \"any\": false,\n            \"Object\": true,\n            \"Function\": true\n        }]\n    }\n}\n\n// or, the following is equivalent as default is true:\n\n{\n    \"rules\": {\n        \"ft-flow/no-weak-types\": [2, {\n            \"any\": false\n        }]\n    }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\nfunction foo(thing): any {}\n// Message: Unexpected use of weak type \"any\"\n\nfunction foo(thing): Promise<any> {}\n// Message: Unexpected use of weak type \"any\"\n\nfunction foo(thing): Promise<Promise<any>> {}\n// Message: Unexpected use of weak type \"any\"\n\nfunction foo(thing): Object {}\n// Message: Unexpected use of weak type \"Object\"\n\nfunction foo(thing): Promise<Object> {}\n// Message: Unexpected use of weak type \"Object\"\n\nfunction foo(thing): Promise<Promise<Object>> {}\n// Message: Unexpected use of weak type \"Object\"\n\nfunction foo(thing): Function {}\n// Message: Unexpected use of weak type \"Function\"\n\nfunction foo(thing): Promise<Function> {}\n// Message: Unexpected use of weak type \"Function\"\n\nfunction foo(thing): Promise<Promise<Function>> {}\n// Message: Unexpected use of weak type \"Function\"\n\n(foo: any) => {}\n// Message: Unexpected use of weak type \"any\"\n\n(foo: Function) => {}\n// Message: Unexpected use of weak type \"Function\"\n\n(foo?: any) => {}\n// Message: Unexpected use of weak type \"any\"\n\n(foo?: Function) => {}\n// Message: Unexpected use of weak type \"Function\"\n\n(foo: { a: any }) => {}\n// Message: Unexpected use of weak type \"any\"\n\n(foo: { a: Object }) => {}\n// Message: Unexpected use of weak type \"Object\"\n\n(foo: any[]) => {}\n// Message: Unexpected use of weak type \"any\"\n\ntype Foo = any\n// Message: Unexpected use of weak type \"any\"\n\ntype Foo = Function\n// Message: Unexpected use of weak type \"Function\"\n\ntype Foo = { a: any }\n// Message: Unexpected use of weak type \"any\"\n\ntype Foo = { a: Object }\n// Message: Unexpected use of weak type \"Object\"\n\ntype Foo = { (a: Object): string }\n// Message: Unexpected use of weak type \"Object\"\n\ntype Foo = { (a: string): Function }\n// Message: Unexpected use of weak type \"Function\"\n\nfunction foo(thing: any) {}\n// Message: Unexpected use of weak type \"any\"\n\nfunction foo(thing: Object) {}\n// Message: Unexpected use of weak type \"Object\"\n\nvar foo: Function\n// Message: Unexpected use of weak type \"Function\"\n\nvar foo: Object\n// Message: Unexpected use of weak type \"Object\"\n\nclass Foo { props: any }\n// Message: Unexpected use of weak type \"any\"\n\nclass Foo { props: Object }\n// Message: Unexpected use of weak type \"Object\"\n\nvar foo: any\n// Message: Unexpected use of weak type \"any\"\n\n// Options: [{\"Function\":false}]\ntype X = any; type Y = Function; type Z = Object\n// Message: Unexpected use of weak type \"any\"\n// Message: Unexpected use of weak type \"Object\"\n\n// Options: [{\"any\":false,\"Object\":false}]\ntype X = any; type Y = Function; type Z = Object\n// Message: Unexpected use of weak type \"Function\"\n\n// Options: [{\"suppressTypes\":[\"$FlowFixMe\"]}]\nconst a: $FlowFixMe = 1\n// Message: Unexpected use of custom weak type \"$FlowFixMe\"\n\n// Options: [{\"suppressTypes\":[\"$FlowFixMe\",\"Something\"]}]\nconst a: Something = 1\n// Message: Unexpected use of custom weak type \"Something\"\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// Options: [{\"any\":false,\"Object\":false}]\ntype X = any; type Y = Object\n\n// Options: [{\"Function\":false}]\ntype X = Function\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\nfunction foo(thing): Function {}\n\n// Options: [{\"suppressTypes\":[\"$FlowFixMe\"]}]\n// $FlowFixMe\nconst a: string = 1\n\n// Options: [{\"suppressTypes\":[\"Foo\"]}]\nconst Foo = 1\n```\n\n\n\n<a name=\"object-type-curly-spacing\"></a>\n### `object-type-curly-spacing`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nThis rule enforces consistent spacing inside braces of object types.\n\n<a name=\"options\"></a>\n#### Options\n\nThe rule has a string option:\n\n* `\"never\"` (default): disallows spacing inside of braces.\n* `\"always\"`: requires spacing inside of braces.\n\n\nThe following patterns are considered problems:\n\n```js\ntype obj = { \"foo\": \"bar\" }\n// Message: There must be no space after \"{\".\n// Message: There must be no space before \"}\".\n\ntype obj = {\"foo\": \"bar\" }\n// Message: There must be no space before \"}\".\n\ntype obj = {\"foo\": \"bar\", ... }\n// Message: There must be no space before \"}\".\n\ntype obj = {|\"foo\": \"bar\" |}\n// Message: There must be no space before \"|}\".\n\ntype obj = {\"foo\": \"bar\", [key: string]: string }\n// Message: There must be no space before \"}\".\n\ntype obj = {\n\"foo\": \"bar\", [key: string]: string }\n// Message: There must be no space before \"}\".\n\ntype obj = { baz: {\"foo\": \"qux\"}, bar: 4}\n// Message: There must be no space after \"{\".\n\n// Options: [\"always\"]\ntype obj = {\"foo\": \"bar\"}\n// Message: A space is required after \"{\".\n// Message: A space is required before \"}\".\n\n// Options: [\"always\"]\ntype obj = {\"foo\": \"bar\" }\n// Message: A space is required after \"{\".\n\n// Options: [\"always\"]\ntype obj = { baz: {\"foo\": \"qux\"}, bar: 4}\n// Message: A space is required before \"}\".\n// Message: A space is required after \"{\".\n// Message: A space is required before \"}\".\n\n// Options: [\"always\"]\ntype obj = { baz: { \"foo\": \"qux\" }, bar: 4}\n// Message: A space is required before \"}\".\n\n// Options: [\"always\"]\ntype obj = { \"foo\": \"bar\", ...}\n// Message: A space is required before \"}\".\n\n// Options: [\"always\"]\ntype obj = {|\"foo\": \"bar\" |}\n// Message: A space is required after \"{|\".\n\n// Options: [\"always\"]\ntype obj = {\"foo\": \"bar\", [key: string]: string }\n// Message: A space is required after \"{\".\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype obj = {baz: {\"foo\": \"qux\"}, bar: 4}\n\ntype obj = {foo: {\"foo\": \"qux\"}}\n\ntype obj = {foo: \"bar\"}\n\ntype obj = {foo: \"bar\"\n}\n\ntype obj = {\nfoo: \"bar\"}\n\ntype obj = {\nfoo: \"bar\"\n}\n\ntype obj = {\nfoo: \"bar\",\nee: \"bar\",\n}\n\ntype obj = {\nfoo: \"bar\",\nee: \"bar\",\n             }\n\ntype obj = {|\"foo\": \"bar\"|}\n\ntype obj = {\"foo\": \"bar\", [key: string]: string}\n\n// Options: [\"always\"]\ntype obj = { baz: { \"foo\": \"qux\" }, bar: 4 }\n\n// Options: [\"always\"]\ntype obj = {}\n\n// Options: [\"always\"]\ntype obj = {\nfoo: \"bar\"\n}\n\n// Options: [\"always\"]\ntype obj = { baz: 4 }\n\n// Options: [\"always\"]\ntype obj = {| \"foo\": \"bar\" |}\n\n// Options: [\"always\"]\ntype obj = { \"foo\": \"bar\", [key: string]: string }\n\n// Options: [\"always\"]\ntype obj = {  baz: { \"foo\": \"qux\" }, bar: 4  }\n\n// Options: [\"always\"]\ntype obj = {\n  baz: { \"foo\": \"qux\" }, bar: 4\n}\n```\n\n\n\n<a name=\"object-type-delimiter\"></a>\n### `object-type-delimiter`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces consistent separators between properties in Flow object types.\n\nThis rule takes one argument.\n\nIf it is `'comma'` then a problem is raised when using `;` as a separator.\n\nIf it is `'semicolon'` then a problem is raised when using `,` as a separator.\n\nThe default value is `'comma'`.\n\n_This rule is ported from `babel/flow-object-type`, however the default option was changed._\n\nThe following patterns are considered problems:\n\n```js\n// Options: [\"semicolon\"]\ntype Foo = { a: Foo, b: Bar }\n// Message: Prefer semicolons to commas in object and class types\n\n// Options: [\"comma\"]\ntype Foo = { a: Foo; b: Bar }\n// Message: Prefer commas to semicolons in object and class types\n\n// Options: [\"semicolon\"]\ntype Foo = { [a: string]: Foo, [b: string]: Bar }\n// Message: Prefer semicolons to commas in object and class types\n\n// Options: [\"comma\"]\ntype Foo = { [a: string]: Foo; [b: string]: Bar }\n// Message: Prefer commas to semicolons in object and class types\n\n// Options: [\"semicolon\"]\ntype Foo = { (): Foo, (): Bar }\n// Message: Prefer semicolons to commas in object and class types\n\n// Options: [\"comma\"]\ntype Foo = { (): Foo; (): Bar }\n// Message: Prefer commas to semicolons in object and class types\n\n// Options: [\"semicolon\"]\ndeclare class Foo { a: Foo, }\n// Message: Prefer semicolons to commas in object and class types\n\n// Options: [\"comma\"]\ndeclare class Foo { a: Foo; }\n// Message: Prefer commas to semicolons in object and class types\n\n// Options: [\"semicolon\"]\ndeclare class Foo { [a: string]: Foo, }\n// Message: Prefer semicolons to commas in object and class types\n\n// Options: [\"comma\"]\ndeclare class Foo { a: Foo; }\n// Message: Prefer commas to semicolons in object and class types\n\n// Options: [\"semicolon\"]\ndeclare class Foo { (): Foo, }\n// Message: Prefer semicolons to commas in object and class types\n\n// Options: [\"comma\"]\ndeclare class Foo { (): Foo; }\n// Message: Prefer commas to semicolons in object and class types\n\n// Options: [\"semicolon\"]\ndeclare class Foo { static (): Foo, }\n// Message: Prefer semicolons to commas in object and class types\n\n// Options: [\"comma\"]\ndeclare class Foo { static (): Foo; }\n// Message: Prefer commas to semicolons in object and class types\n```\n\nThe following patterns are not considered problems:\n\n```js\n// Options: [\"semicolon\"]\ntype Foo = { a: Foo; b: Bar }\n\n// Options: [\"comma\"]\ntype Foo = { a: Foo, b: Bar }\n\n// Options: [\"semicolon\"]\ntype Foo = { [a: string]: Foo; [b: string]: Bar }\n\n// Options: [\"comma\"]\ntype Foo = { [a: string]: Foo, [b: string]: Bar }\n\n// Options: [\"semicolon\"]\ntype Foo = { (): Foo; (): Bar }\n\n// Options: [\"comma\"]\ntype Foo = { (): Foo, (): Bar }\n\ntype Foo = { a: Foo, b: Bar }\n\ntype Foo = { [a: string]: Foo, [b: string]: Bar }\n\ntype Foo = { (): Foo, (): Bar }\n\n// Options: [\"semicolon\"]\ndeclare class Foo { a: Foo; }\n\n// Options: [\"comma\"]\ndeclare class Foo { a: Foo, }\n\n// Options: [\"semicolon\"]\ndeclare class Foo { [a: string]: Foo; }\n\n// Options: [\"comma\"]\ndeclare class Foo { [a: string]: Foo, }\n\n// Options: [\"semicolon\"]\ndeclare class Foo { (): Foo; }\n\n// Options: [\"comma\"]\ndeclare class Foo { (): Foo, }\n\n// Options: [\"semicolon\"]\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ntype Foo = { a: Foo, b: Bar }\n```\n\n\n\n<a name=\"quotes\"></a>\n### `quotes`\n\nEnforces single quotes or double quotes around string literals.\n\n<a name=\"options\"></a>\n#### Options\n\nThe rule has string options of:\n\n* `\"double\"` (default) requires double quotes around string literals.\n* `\"single\"` requires single quotes around string literals.\n\nThe following patterns are considered problems:\n\n```js\ntype T = 'hi'\n// Message: String literals must use double quote.\n\n// Options: [\"double\"]\ntype T = { test: 'hello' | 'test' }\n// Message: String literals must use double quote.\n// Message: String literals must use double quote.\n\n// Options: [\"double\"]\ntype T = { test: \"hello\" | 'test', t: 'hello' }\n// Message: String literals must use double quote.\n// Message: String literals must use double quote.\n\n// Options: [\"single\"]\ntype T = \"hi\"\n// Message: String literals must use single quote.\n\n// Options: [\"single\"]\ntype T = { test: \"hello\" | \"test\" }\n// Message: String literals must use single quote.\n// Message: String literals must use single quote.\n\n// Options: [\"single\"]\ntype T = { test: \"hello\" | 'test', t: 'hello' }\n// Message: String literals must use single quote.\n```\n\nThe following patterns are not considered problems:\n\n```js\n// Options: [\"double\"]\ntype T = \"hi\"\n\n// Options: [\"double\"]\ntype T = { test: \"hello\" | \"test\" }\n\n// Options: [\"double\"]\ntype T = { test: \"hello\" | \"test\", t: \"hello\" }\n\n// Options: [\"single\"]\ntype FooType = 'hi'\n\n// Options: [\"single\"]\ntype T = { test: 'hello' | 'test' }\n\n// Options: [\"single\"]\ntype T = { test: 'hello' | 'test', t: 'hello' }\n```\n\n\n\n<a name=\"require-compound-type-alias\"></a>\n### `require-compound-type-alias`\n\nRequires to make a type alias for all [union](https://flow.org/en/docs/types/unions/) and [intersection](https://flow.org/en/docs/types/intersections/) types. If these are used in \"raw\" forms it might be tempting to just copy & paste them around the code. However, this brings sort of a source code pollution and unnecessary changes on several parts when these compound types need to be changed.\n\n<a name=\"options\"></a>\n#### Options\n\nThe rule has two options:\n\n1. a string option\n\n* `\"always\"` (default)\n* `\"never\"`\n\n2. an object\n\n```js\n{\n  \"rules\": {\n    \"flowtype/require-compound-type-alias\": [\n      2,\n      \"always\",\n      {\n        \"allowNull\": true\n      }\n    ]\n  }\n}\n```\n\n* `allowNull` – allows compound types where one of the members is a `null`, e.g. `string | null`.\n\nThe following patterns are considered problems:\n\n```js\n// Options: [\"always\",{\"allowNull\":false}]\nconst foo: string | null = null;\n// Message: All union types must be declared with named type alias.\n\nfunction foo(bar: \"A\" | \"B\") {}\n// Message: All union types must be declared with named type alias.\n\nconst foo: \"A\" | \"B\" = \"A\";\n// Message: All union types must be declared with named type alias.\n\ntype Foo = { bar: \"A\" | \"B\" };\n// Message: All union types must be declared with named type alias.\n\nfunction foo(bar: { n: number } | { s: string }) {}\n// Message: All union types must be declared with named type alias.\n\nfunction foo(bar: { n: number } & { s: string }) {}\n// Message: All intersection types must be declared with named type alias.\n\nconst foo: { n: number } & { s: string } = { n: 0, s: \"\" };\n// Message: All intersection types must be declared with named type alias.\n\ntype Foo = { bar: { n: number } & { s: string } };\n// Message: All intersection types must be declared with named type alias.\n\nfunction foo(bar: { n: number } & { s: string }) {}\n// Message: All intersection types must be declared with named type alias.\n```\n\nThe following patterns are not considered problems:\n\n```js\nconst foo: string | null = null;\n\n// Options: [\"always\",{\"allowNull\":true}]\nconst foo: string | null = null;\n\ntype Foo = \"A\" | \"B\";\n\ntype Bar = \"A\" | \"B\"; function foo(bar: Bar) {}\n\ntype Foo = { disjoint: \"A\", n: number } | { disjoint: \"B\", s: string };\n\ntype Foo = { n: number } & { s: string };\n\ntype Bar = { n: number } & { s: string }; function foo(bar: Bar) {}\n\n// Options: [\"never\"]\nfunction foo(bar: \"A\" | \"B\") {}\n\n// Options: [\"never\"]\nfunction foo(bar: { n: number } & { s: string }) {}\n```\n\n\n\n<a name=\"require-exact-type\"></a>\n### `require-exact-type`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nThis rule enforces [exact object types](https://flow.org/en/docs/types/objects/#toc-exact-object-types).\n\n<a name=\"options\"></a>\n#### Options\n\nThe rule has one string option:\n\n* `\"always\"` (default): Report all object type definitions that aren't exact.\n* `\"never\"`: Report all object type definitions that are exact.\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/require-exact-type\": [\n      2,\n      \"always\"\n    ]\n  }\n}\n\n{\n  \"rules\": {\n    \"ft-flow/require-exact-type\": [\n      2,\n      \"never\"\n    ]\n  }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\ntype foo = {};\n// Message: Object type must be exact.\n\ntype foo = { bar: string };\n// Message: Object type must be exact.\n\n// Options: [\"always\"]\ntype foo = Array<{bar: string}>;\n// Message: Object type must be exact.\n\n// Options: [\"always\"]\n(foo: Array<{bar: string}>) => {};\n// Message: Object type must be exact.\n\n// Options: [\"always\"]\ninterface StackFrame {\n          colno?: number;\n          lineno?: number;\n          filename?: string;\n          function?: { name: string };\n      }\n// Message: Object type must be exact.\n\n// Options: [\"never\"]\ntype foo = {| |};\n// Message: Object type must not be exact.\n\n// Options: [\"never\"]\ntype foo = {| bar: string |};\n// Message: Object type must not be exact.\n\n// Options: [\"never\"]\ntype foo = { bar: {| baz: string |} };\n// Message: Object type must not be exact.\n\n// Options: [\"never\"]\ntype foo = Array<{| bar: string |}>;\n// Message: Object type must not be exact.\n\n// Options: [\"never\"]\n(foo: Array<{| bar: string |}>) => {};\n// Message: Object type must not be exact.\n\n// Options: [\"never\"]\ninterface StackFrame {\n          colno?: number;\n          lineno?: number;\n          filename?: string;\n          function?: {| name: string |};\n      }\n// Message: Object type must not be exact.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype foo = {| |};\n\ntype foo = {| bar: string |};\n\ntype foo = { [key: string]: string };\n\ntype foo = number;\n\n// Options: [\"always\"]\ntype foo = {| |};\n\n// Options: [\"always\"]\ntype foo = {| bar: string |};\n\n// Options: [\"always\"]\ntype foo = {| bar: {| baz: string |} |};\n\n// Options: [\"always\"]\ntype foo = Array<{| bar: string |}>;\n\n// Options: [\"always\"]\ntype foo = number;\n\n// Options: [\"always\"]\ninterface StackFrame {\n          colno?: number;\n          lineno?: number;\n          filename?: string;\n          function?: {| name: string |};\n      }\n\n// Options: [\"always\"]\ndeclare class MyEvent extends Event {\n        key: string\n      }\n\n// Options: [\"never\"]\ntype foo = { };\n\n// Options: [\"never\"]\ntype foo = { bar: string };\n\n// Options: [\"never\"]\ntype foo = { bar: { baz: string } };\n\n// Options: [\"never\"]\ntype foo = Array<{bar: string}>;\n\n// Options: [\"never\"]\ntype foo = number;\n\n// Options: [\"always\"]\ninterface StackFrame {\n          colno?: number;\n          lineno?: number;\n          filename?: string;\n          function?: {| name: string |};\n      }\n\ntype A = { a: string, ... }\n```\n\n\n\n<a name=\"require-indexer-name\"></a>\n### `require-indexer-name`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nThis rule validates Flow object indexer name.\n\n<a name=\"options\"></a>\n#### Options\n\nThe rule has a string option:\n\n* `\"never\"` (default): Never report files that are missing an indexer key name.\n* `\"always\"`: Always report files that are missing an indexer key name.\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/require-indexer-name\": [\n      2,\n      \"always\"\n    ]\n  }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\ntype foo = { [string]: number };\n// Message: All indexers must be declared with key name.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype foo = { [key: string]: number };\n\n// Options: [\"never\"]\ntype foo = { [key: string]: number };\n\n// Options: [\"never\"]\ntype foo = { [string]: number };\n```\n\n\n\n<a name=\"require-inexact-type\"></a>\n### `require-inexact-type`\n\nThis rule enforces explicit inexact object types.\n\n<a name=\"options\"></a>\n#### Options\n\nThe rule has one string option:\n\n- `\"always\"` (default): Report all object type definitions that aren't explicit inexact, but ignore exact objects.\n- `\"never\"`: Report all object type definitions that are explicit inexact.\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/require-inexact-type\": [\n      2,\n      \"always\"\n    ]\n  }\n}\n\n{\n  \"rules\": {\n    \"ft-flow/require-inexact-type\": [\n      2,\n      \"never\"\n    ]\n  }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\ntype foo = {};\n// Message: Type must be explicit inexact.\n\ntype foo = { bar: string };\n// Message: Type must be explicit inexact.\n\n// Options: [\"always\"]\ntype foo = {};\n// Message: Type must be explicit inexact.\n\n// Options: [\"always\"]\ntype foo = { bar: string };\n// Message: Type must be explicit inexact.\n\n// Options: [\"never\"]\ntype foo = {...};\n// Message: Type must not be explicit inexact.\n\n// Options: [\"never\"]\ntype foo = { bar: string, ... };\n// Message: Type must not be explicit inexact.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype foo = { foo: string, ... };\n\ninterface Foo { foo: string }\n\ndeclare class Foo { foo: string }\n\ntype foo = {| |};\n\ntype foo = {| bar: string |};\n\ntype foo = { [key: string]: string, ... };\n\ntype foo = number;\n\n// Options: [\"always\"]\ntype foo = {| |};\n\n// Options: [\"always\"]\ntype foo = {...};\n\n// Options: [\"always\"]\ntype foo = { bar: string, ... };\n\n// Options: [\"always\"]\ntype foo = {| bar: string |};\n\n// Options: [\"always\"]\ntype foo = number;\n\n// Options: [\"never\"]\ntype foo = { };\n\n// Options: [\"never\"]\ntype foo = {| |};\n\n// Options: [\"never\"]\ntype foo = { bar: string };\n\n// Options: [\"never\"]\ntype foo = {| bar: string |};\n\n// Options: [\"never\"]\ntype foo = number;\n```\n\n\n\n<a name=\"require-parameter-type\"></a>\n### `require-parameter-type`\n\nRequires that all function parameters have type annotations.\n\n<a name=\"options\"></a>\n#### Options\n\nYou can skip all arrow functions by providing the `excludeArrowFunctions` option with `true`.\n\nAlternatively, you can want to exclude only concise arrow functions (e.g. `x => x * 2`). Provide `excludeArrowFunctions` with `expressionsOnly` for this.\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/require-parameter-type\": [\n            2,\n            {\n              \"excludeArrowFunctions\": true\n            }\n        ]\n    }\n}\n\n{\n    \"rules\": {\n        \"ft-flow/require-parameter-type\": [\n            2,\n            {\n              \"excludeArrowFunctions\": \"expressionsOnly\"\n            }\n        ]\n    }\n}\n```\n\nYou can exclude parameters that match a certain regex by using `excludeParameterMatch`.\n\n```js\n{\n    \"rules\": {\n        \"flowtype/require-parameter-type\": [\n            2,\n            {\n              \"excludeParameterMatch\": \"^_\"\n            }\n        ]\n    }\n}\n```\n\nThis excludes all parameters that start with an underscore (`_`).\nThe default pattern is `a^`, which doesn't match anything, i.e., all parameters are checked.\n\nThe following patterns are considered problems:\n\n```js\n(foo) => {}\n// Message: Missing \"foo\" parameter type annotation.\n\nfunction x(foo) {}\n// Message: Missing \"foo\" parameter type annotation.\n\n// Options: [{\"excludeArrowFunctions\":true}]\nfunction x(foo) {}\n// Message: Missing \"foo\" parameter type annotation.\n\n(foo = 'FOO') => {}\n// Message: Missing \"foo\" parameter type annotation.\n\n(...foo) => {}\n// Message: Missing \"foo\" parameter type annotation.\n\n({foo}) => {}\n// Message: Missing \"{foo}\" parameter type annotation.\n\n([foo]) => {}\n// Message: Missing \"[foo]\" parameter type annotation.\n\n({foo = 1} = {}) => {}\n// Message: Missing \"{foo = 1}\" parameter type annotation.\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\n// @flow\n(foo) => {}\n// Message: Missing \"foo\" parameter type annotation.\n\n// Options: [{\"excludeArrowFunctions\":\"expressionsOnly\"}]\n(foo) => {}\n// Message: Missing \"foo\" parameter type annotation.\n\n// Options: [{\"excludeArrowFunctions\":\"expressionsOnly\"}]\nfunction x(foo) {}\n// Message: Missing \"foo\" parameter type annotation.\n\n// Options: [{\"excludeParameterMatch\":\"^_\"}]\n(_foo: number, bar) => {}\n// Message: Missing \"bar\" parameter type annotation.\n\n// Options: [{\"excludeParameterMatch\":\"^_\"}]\n(_foo, bar) => {}\n// Message: Missing \"bar\" parameter type annotation.\n```\n\nThe following patterns are not considered problems:\n\n```js\n(foo: string) => {}\n\n(foo: string = 'FOO') => {}\n\n(...foo: string) => {}\n\nconst f: Foo = (a, b) => 42;\n\n({foo}: {foo: string}) => {}\n\n([foo]: Array) => {}\n\ntype fn = (a: string, b: number) => number;\nconst f: fn = (a, b) => {}\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\n(foo) => {}\n\n// Options: [{\"excludeArrowFunctions\":true}]\n(foo) => {}\n\n// Options: [{\"excludeArrowFunctions\":\"expressionsOnly\"}]\n(foo) => 3\n\n// Options: [{\"excludeParameterMatch\":\"^_\"}]\n(_foo, bar: string) => {}\n\n// Options: [{\"excludeParameterMatch\":\"^_\"}]\n(_foo: number, bar: string) => {}\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\n(foo) => {}\n```\n\n\n\n<a name=\"require-readonly-react-props\"></a>\n### `require-readonly-react-props`\n\nThis rule validates that React props are marked as `$ReadOnly`. React props are immutable and modifying them could lead to unexpected results. Marking prop shapes as `$ReadOnly` avoids these issues.\n\nThe rule tries its best to work with both class and functional components. For class components, it does a fuzzy check for one of \"Component\", \"PureComponent\", \"React.Component\" and \"React.PureComponent\". It doesn't actually infer that those identifiers resolve to a proper `React.Component` object.\n\nFor example, this will NOT be checked:\n\n```js\nimport MyReact from 'react';\nclass Foo extends MyReact.Component { }\n```\n\nAs a result, you can safely use other classes without getting warnings from this rule:\n\n```js\nclass MyClass extends MySuperClass { }\n```\n\nReact's functional components are hard to detect statically. The way it's done here is by searching for JSX within a function. When present, a function is considered a React component:\n\n```js\n// this gets checked\ntype Props = { };\nfunction MyComponent(props: Props) {\n    return <p />;\n}\n\n// this doesn't get checked since no JSX is present in a function\ntype Options = { };\nfunction SomeHelper(options: Options) {\n    // ...\n}\n\n// this doesn't get checked since no JSX is present directly in a function\nfunction helper() { return <p /> }\nfunction MyComponent(props: Props) {\n    return helper();\n}\n```\n\nThe rule only works for locally defined props that are marked with a `$ReadOnly` or using covariant notation. It doesn't work with imported props:\n\n```js\n// the rule has no way of knowing whether ImportedProps are read-only\nimport { type ImportedProps } from './somewhere';\nclass Foo extends React.Component<ImportedProps> { }\n\n\n// the rule also checks for covariant properties\ntype Props = {|\n    +foo: string\n|};\nclass Bar extends React.Component<Props> { }\n\n// this fails because the object is not fully read-only\ntype Props = {|\n    +foo: string,\n    bar: number,\n|};\nclass Bar extends React.Component<Props> { }\n\n// this fails because spreading makes object mutable (as of Flow 0.98)\n// https://github.com/gajus/eslint-plugin-flowtype/pull/400#issuecomment-489813899\ntype Props = {|\n    +foo: string,\n    ...bar,\n|};\nclass Bar extends React.Component<Props> { }\n```\n\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/require-readonly-react-props\": 2\n    }\n}\n```\n\n\nOptionally, you can enable support for [implicit exact Flow types](https://medium.com/flow-type/on-the-roadmap-exact-objects-by-default-16b72933c5cf) (useful when using `exact_by_default=true` Flow option):\n\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/require-readonly-react-props\": [\n            2,\n            {\n                \"useImplicitExactTypes\": true\n            }\n        ]\n    }\n}\n```\n\n\nIf you’re using [experimental TypeScript syntax](https://github.com/facebook/flow/blob/main/Changelog.md#02290) via the `experimental.ts_syntax=true` Flow option, you can adjust this lint rule to check for that syntax, e.g., `Readonly` versus `$ReadOnly`.\n\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/require-readonly-react-props\": [\n            2,\n            {\n                \"useExperimentalTypeScriptSyntax\": true\n            }\n        ]\n    }\n}\n```\n\n\nThe following patterns are considered problems:\n\n```js\ntype Props = { }; class Foo extends React.Component<Props> { }\n// Message: Props must be $ReadOnly\n\n// Options: [{\"useExperimentalTypeScriptSyntax\":true}]\ntype Props = { }; class Foo extends React.Component<Props> { }\n// Message: Props must be Readonly\n\n// Options: [{\"useExperimentalTypeScriptSyntax\":false}]\ntype Props = Readonly<{ }>; class Foo extends React.Component<Props> { }\n// Message: Props must be $ReadOnly\n\ntype Props = Readonly<{ }>; class Foo extends React.Component<Props> { }\n// Message: Props must be $ReadOnly\n\ntype OtherProps = { foo: string }; class Foo extends React.Component<OtherProps> { }\n// Message: OtherProps must be $ReadOnly\n\nclass Foo extends React.Component<{}> { }\n// Message: Foo class props must be $ReadOnly\n\ntype Props = { bar: {} }; class Foo extends React.Component<Props, State> { }\n// Message: Props must be $ReadOnly\n\ntype Props = { }; class Foo extends Component<Props> { }\n// Message: Props must be $ReadOnly\n\ntype Props = { }; class Foo extends PureComponent<Props> { }\n// Message: Props must be $ReadOnly\n\nexport type Props = {}; class Foo extends Component<Props> { }\n// Message: Props must be $ReadOnly\n\ntype Props = {| foo: string |}; class Foo extends Component<Props> { }\n// Message: Props must be $ReadOnly\n\ntype Props = {| foo: string |} | {| bar: number |}; class Foo extends Component<Props> { }\n// Message: Props must be $ReadOnly\n\n// Options: [{\"useImplicitExactTypes\":true}]\ntype Props = { foo: string } | { bar: number }; class Foo extends Component<Props> { }\n// Message: Props must be $ReadOnly\n\ntype Props = {| +foo: string, ...bar |}; class Foo extends Component<Props> { }\n// Message: Props must be $ReadOnly\n\ntype Props = {| +foo: string, -bar: number |}; class Foo extends Component<Props> { }\n// Message: Props must be $ReadOnly\n\ntype Props = { }; function Foo(props: Props) { return <p /> }\n// Message: Props must be $ReadOnly\n\n// Options: [{\"useExperimentalTypeScriptSyntax\":true}]\ntype Props = { }; function Foo(props: Props) { return <p /> }\n// Message: Props must be Readonly\n\n// Options: [{\"useExperimentalTypeScriptSyntax\":false}]\ntype Props = Readonly<{ }>; function Foo(props: Props) { return <p /> }\n// Message: Props must be $ReadOnly\n\ntype Props = Readonly<{ }>; function Foo(props: Props) { return <p /> }\n// Message: Props must be $ReadOnly\n\ntype Props = { }; function Foo(props: Props) { return foo ? <p /> : <span /> }\n// Message: Props must be $ReadOnly\n\nfunction Foo(props: {}) { return <p /> }\n// Message: Foo component props must be $ReadOnly\n\nexport type Props = {}; function Foo(props: Props) { return <p /> }\n// Message: Props must be $ReadOnly\n```\n\nThe following patterns are not considered problems:\n\n```js\nclass Foo extends React.Component<$ReadOnly<{}>> { }\n\n// Options: [{\"useExperimentalTypeScriptSyntax\":true}]\nclass Foo extends React.Component<Readonly<{}>> { }\n\ntype Props = $ReadOnly<{}>; class Foo extends React.Component<Props> { }\n\ntype Props = $ReadOnly<{}>; class Foo extends React.PureComponent<Props> { }\n\nclass Foo extends React.Component<$ReadOnly<{}, State>> { }\n\ntype Props = $ReadOnly<{}>; class Foo extends React.Component<Props, State> { }\n\ntype Props = $ReadOnly<{}>; class Foo extends Component<Props> { }\n\ntype Props = $ReadOnly<{}>; class Foo extends PureComponent<Props> { }\n\ntype FooType = {}; class Foo extends Bar<FooType> { }\n\nclass Foo { }\n\nexport type Props = $ReadOnly<{}>; class Foo extends Component<Props, State> { }\n\nexport type Props = $ReadOnly<{}>; export class Foo extends Component<Props> { }\n\ntype Props = {| +foo: string |}; class Foo extends Component<Props> { }\n\ntype Props = {| +foo: string, +bar: number |}; class Foo extends Component<Props> { }\n\ntype Props = {| +foo: string |} | {| +bar: number |}; class Foo extends Component<Props> { }\n\n// Options: [{\"useImplicitExactTypes\":true}]\ntype Props = { +foo: string } | { +bar: number }; class Foo extends Component<Props> { }\n\ntype Props = $FlowFixMe; class Foo extends Component<Props> { }\n\ntype Props = {||}; class Foo extends Component<Props> { }\n\n// Options: [{\"useImplicitExactTypes\":true}]\ntype Props = {||}; class Foo extends Component<Props> { }\n\n// Options: [{\"useImplicitExactTypes\":true}]\ntype Props = {}; class Foo extends Component<Props> { }\n\nclass Foo extends Component<{||}> { }\n\n// Options: [{\"useImplicitExactTypes\":true}]\nclass Foo extends Component<{||}> { }\n\n// Options: [{\"useImplicitExactTypes\":true}]\nclass Foo extends Component<{}> { }\n\nclass Foo extends React.Component<UnknownProps> { }\n\nimport { type Props } from \"file\"; class Foo extends React.Component<Props> { }\n\ntype Props = {}; function Foo() { }\n\ntype Props = $ReadOnly<{}>; function Foo(props: Props) { }\n\n// Options: [{\"useExperimentalTypeScriptSyntax\":true}]\ntype Props = Readonly<{}>; function Foo(props: Props) { }\n\ntype Props = {}; function Foo(props: OtherProps) { }\n\nfunction Foo() { return <p /> }\n\nfunction Foo(props: $FlowFixMe) { return <p /> }\n\nfunction Foo(props: {||}) { return <p /> }\n\n// Options: [{\"useImplicitExactTypes\":true}]\nfunction Foo(props: {||}) { return <p /> }\n\n// Options: [{\"useImplicitExactTypes\":true}]\nfunction Foo(props: {}) { return <p /> }\n```\n\n\n\n<a name=\"require-return-type\"></a>\n### `require-return-type`\n\nRequires that functions have return type annotation.\n\n<a name=\"options\"></a>\n#### Options\n\nYou can skip all arrow functions by providing the `excludeArrowFunctions` option with `true`.\n\nAlternatively, you can exclude a concise arrow function (e.g. `() => 2`). Provide `excludeArrowFunctions` with `expressionsOnly` for this.\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/require-return-type\": [\n            2,\n            \"always\",\n            {\n              \"excludeArrowFunctions\": true\n            }\n        ]\n    }\n}\n\n{\n    \"rules\": {\n        \"ft-flow/require-return-type\": [\n            2,\n            \"always\",\n            {\n              \"excludeArrowFunctions\": \"expressionsOnly\"\n            }\n        ]\n    }\n}\n```\n\nYou can exclude or include specific tests with the `includeOnlyMatching` and `excludeMatching` rules.\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/require-return-type\": [\n            2,\n            \"always\",\n            {\n              \"includeOnlyMatching\": [\n                  \"^F.*\",\n                  \"Ba(r|z)\"\n              ]\n            }\n        ]\n    }\n}\n\n{\n    \"rules\": {\n        \"ft-flow/require-return-type\": [\n            2,\n            \"always\",\n            {\n              \"excludeMatching\": [\n                  \"^F.*\",\n                  \"Ba(r|z)\"\n              ]\n            }\n        ]\n    }\n}\n\n```\n\nBoth rules take an array that can contain either strings or valid RegExp statements.\n\nThe following patterns are considered problems:\n\n```js\n(foo) => { return \"foo\"; }\n// Message: Missing return type annotation.\n\n// Options: [\"always\"]\n(foo) => { return \"foo\"; }\n// Message: Missing return type annotation.\n\n// Options: [\"always\"]\n(foo) => \"foo\"\n// Message: Missing return type annotation.\n\n(foo) => ({})\n// Message: Missing return type annotation.\n\n/* @flow */\n(foo) => { return 1; }\n// Message: Missing return type annotation.\n\n(foo): undefined => { return; }\n// Message: Must not annotate undefined return type.\n\n(foo): void => { return; }\n// Message: Must not annotate undefined return type.\n\n(foo): undefined => { return undefined; }\n// Message: Must not annotate undefined return type.\n\n(foo): void => { return void 0; }\n// Message: Must not annotate undefined return type.\n\n// Options: [\"always\",{\"annotateUndefined\":\"never\"}]\n(foo): undefined => { return; }\n// Message: Must not annotate undefined return type.\n\n// Options: [\"always\",{\"annotateUndefined\":\"never\"}]\n(foo): void => { return; }\n// Message: Must not annotate undefined return type.\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\n(foo) => { return; }\n// Message: Must annotate undefined return type.\n\n// Options: [\"always\",{\"annotateUndefined\":\"never\"}]\n(foo): undefined => { return undefined; }\n// Message: Must not annotate undefined return type.\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\n(foo) => { return undefined; }\n// Message: Must annotate undefined return type.\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\n(foo) => { return void 0; }\n// Message: Must annotate undefined return type.\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\n// @flow\n(foo) => { return 1; }\n// Message: Missing return type annotation.\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\n// @flow\n (foo) => { return undefined; }\n// Message: Must annotate undefined return type.\n\n// Options: [\"always\"]\nasync () => { return 2; }\n// Message: Missing return type annotation.\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\nasync () => {}\n// Message: Must annotate undefined return type.\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\nasync function x() {}\n// Message: Must annotate undefined return type.\n\n// Options: [\"always\",{\"annotateUndefined\":\"never\"}]\nasync (): Promise<void> => { return; }\n// Message: Must not annotate undefined return type.\n\n// Options: [\"always\",{\"annotateUndefined\":\"never\"}]\nasync (): Promise<undefined> => { return; }\n// Message: Must not annotate undefined return type.\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\nclass Test { constructor() { } }\n// Message: Must annotate undefined return type.\n\nclass Test { foo() { return 42; } }\n// Message: Missing return type annotation.\n\nclass Test { foo = () => { return 42; } }\n// Message: Missing return type annotation.\n\nclass Test { foo = () => 42; }\n// Message: Missing return type annotation.\n\n// Options: [\"always\"]\nfunction* x() {}\n// Message: Missing return type annotation.\n\n// Options: [\"always\",{\"excludeArrowFunctions\":\"expressionsOnly\"}]\n() => { return 3; }\n// Message: Missing return type annotation.\n\n// Options: [\"always\",{\"excludeArrowFunctions\":\"expressionsOnly\"}]\nasync () => { return 4; }\n// Message: Missing return type annotation.\n\n// Options: [\"always\",{\"includeOnlyMatching\":[\"bar\"]}]\nfunction foo() { return 42; }\nfunction bar() { return 42; }\n// Message: Missing return type annotation.\n\n// Options: [\"always\",{\"includeOnlyMatching\":[\"bar\"]}]\nconst foo = () => { return 42; };\nconst bar = () => { return 42; }\n// Message: Missing return type annotation.\n\n// Options: [\"always\",{\"includeOnlyMatching\":[\"bar\"]}]\nconst foo = { bar() { return 42; }, foobar: function() { return 42; } }\n// Message: Missing return type annotation.\n// Message: Missing return type annotation.\n\n// Options: [\"always\",{\"excludeMatching\":[\"bar\"]}]\nconst foo = { bar() { return 42; }, baz() { return 42; } }\n// Message: Missing return type annotation.\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\nfunction * foo() { yield 2; }\n// Message: Missing return type annotation.\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\nasync function * foo() { yield 2; }\n// Message: Missing return type annotation.\n```\n\nThe following patterns are not considered problems:\n\n```js\nreturn;\n\n(foo): string => {}\n\nconst f: Foo = (a, b) => 42;\n\n// Options: [\"always\"]\n(foo): string => {}\n\ntype fn = (a: string, b: number) => number;\nconst f: fn = (a, b) => { return 42; }\n\n(foo) => { return; }\n\n(foo): Object => ( {} )\n\n(foo) => { return undefined; }\n\n(foo) => { return void 0; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\n(foo): undefined => { return; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\n(foo): void => { return; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"never\"}]\n(foo) => { return; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"never\"}]\n(foo) => { return undefined; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"never\"}]\n(foo) => { return void 0; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\n(foo): undefined => { return undefined; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\n(foo): void => { return void 0; }\n\n// Options: [\"always\"]\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\n(foo) => { return 1; }\n\n// Options: [\"always\"]\n/* @noflow */\n(foo) => { return 1; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\n(foo) => { return undefined; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\nasync function doThing(): Promise<void> {}\n\n// Options: [\"always\",{\"annotateUndefined\":\"ignore\"}]\nasync function doThing(): Promise<void> {}\n\n// Options: [\"always\",{\"annotateUndefined\":\"ignore\"}]\nasync function doThing() {}\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\nfunction* doThing(): Generator<number, void, void> { yield 2; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\",\"excludeMatching\":[\"constructor\"]}]\nclass Test { constructor() { } }\n\nclass Test { constructor() { } }\n\n// Options: [\"always\",{\"excludeMatching\":[\"foo\"]}]\nclass Test { foo() { return 42; } }\n\n// Options: [\"always\",{\"excludeMatching\":[\"foo\"]}]\nclass Test { foo = () => { return 42; } }\n\n// Options: [\"always\",{\"excludeMatching\":[\"foo\"]}]\nclass Test { foo = () => 42; }\n\nclass Test { foo = (): number => { return 42; } }\n\nclass Test { foo = (): number => 42; }\n\nasync (foo): Promise<number> => { return 3; }\n\n// Options: [\"always\",{\"excludeArrowFunctions\":true}]\n() => 3\n\n// Options: [\"always\",{\"excludeArrowFunctions\":true}]\n() => { return 4; }\n\n// Options: [\"always\",{\"excludeArrowFunctions\":true}]\n() => undefined\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\",\"excludeArrowFunctions\":true}]\n() => undefined\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\",\"excludeArrowFunctions\":true}]\n() => { return undefined; }\n\n// Options: [\"always\",{\"excludeArrowFunctions\":\"expressionsOnly\"}]\n() => 3\n\n// Options: [\"always\",{\"excludeArrowFunctions\":\"expressionsOnly\"}]\nasync () => 3\n\n// Options: [\"always\",{\"excludeMatching\":[\"foo\"]}]\nfunction foo() { return 42; }\n\n// Options: [\"always\",{\"includeOnlyMatching\":[\"bar\"]}]\nfunction foo() { return 42; }\n\n// Options: [\"always\",{\"excludeMatching\":[\"bar\"]}]\nfunction foo(): number { return 42; }\nfunction bar() { return 42; }\n\n// Options: [\"always\",{\"includeOnlyMatching\":[\"foo\",\"baz\"]}]\nfunction foo(): number { return 42; }\nfunction bar() { return 42; }\n\n// Options: [\"always\",{\"excludeMatching\":[\"^b.*\",\"qux\"]}]\nfunction foo(): number { return 42; }\nfunction bar() { return 42; }\n\n// Options: [\"always\",{\"includeOnlyMatching\":[\"^f.*\"]}]\nfunction foo(): number { return 42; }\nfunction bar() { return 42; }\n\n// Options: [\"always\",{\"includeOnlyMatching\":[\"bar\"]}]\nconst foo = { baz() { return 42; } }\n\n// Options: [\"always\",{\"excludeMatching\":[\"bar\"]}]\nconst foo = { bar() { return 42; } }\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\nfunction * foo(): Iterable<number> { yield 2; }\n\n// Options: [\"always\",{\"annotateUndefined\":\"always\"}]\nasync function * foo(): AsyncIterable<number> { yield 2; }\n```\n\n\n\n<a name=\"require-types-at-top\"></a>\n### `require-types-at-top`\n\nRequires all type declarations to be at the top of the file, after any import declarations.\n\n<a name=\"options\"></a>\n#### Options\n\nThe rule has a string option:\n\n* `\"never\"`\n* `\"always\"`\n\nThe default value is `\"always\"`.\n\nThe following patterns are considered problems:\n\n```js\nconst foo = 3;\ntype Foo = number;\n// Message: All type declaration must be at the top of the file, after any import declarations.\n\nconst foo = 3;\nopaque type Foo = number;\n// Message: All type declaration must be at the top of the file, after any import declarations.\n\nconst foo = 3;\nexport type Foo = number;\n// Message: All type declaration must be at the top of the file, after any import declarations.\n\nconst foo = 3;\nexport opaque type Foo = number;\n// Message: All type declaration must be at the top of the file, after any import declarations.\n\nconst foo = 3;\ntype Foo = number | string;\n// Message: All type declaration must be at the top of the file, after any import declarations.\n\nimport bar from \"./bar\";\nconst foo = 3;\ntype Foo = number;\n// Message: All type declaration must be at the top of the file, after any import declarations.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype Foo = number;\nconst foo = 3;\n\nopaque type Foo = number;\nconst foo = 3;\n\nexport type Foo = number;\nconst foo = 3;\n\nexport opaque type Foo = number;\nconst foo = 3;\n\ntype Foo = number;\nconst foo = 3;\n\nimport bar from \"./bar\";\ntype Foo = number;\n\ntype Foo = number;\nimport bar from \"./bar\";\n\n// Options: [\"never\"]\nconst foo = 3;\ntype Foo = number;\n```\n\n\n\n<a name=\"require-valid-file-annotation\"></a>\n### `require-valid-file-annotation`\n\nThis rule validates Flow file annotations.\n\nThis rule can optionally report missing or missed placed annotations, common typos (e.g. `// @floww`), and enforce a consistent annotation style.\n\n<a name=\"options\"></a>\n#### Options\n\nThe rule has a string option:\n\n* `\"never\"` (default): Never report files that are missing an `@flow` annotation.\n* `\"always\"`: Always report files that are missing an `@flow` annotation\n\nThis rule has an object option:\n\n* `\"annotationStyle\"` - Enforce a consistent file annotation style.\n    * `\"none\"` (default): Either annotation style is accepted.\n    * `\"line\"`: Require single line annotations (i.e. `// @flow`).\n    * `\"block\"`: Require block annotations (i.e. `/* @flow */`).\n\n* `\"strict\"` - Enforce a strict flow file annotation.\n    * `false` (default): strict flow annotation is not required.\n    * `true`: Require strict flow annotation (i.e. `// @flow strict`).\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/require-valid-file-annotation\": [\n      2,\n      \"always\"\n    ]\n  }\n}\n\n{\n  \"rules\": {\n    \"ft-flow/require-valid-file-annotation\": [\n      2,\n      \"always\", {\n        \"annotationStyle\": \"block\",\n        \"strict\": true,\n      }\n    ]\n  }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\n// Options: [\"always\"]\n#!/usr/bin/env node\n// Message: Flow file annotation is missing.\n\n// Options: [\"always\"]\n#!/usr/bin/env node\na;\n// Message: Flow file annotation is missing.\n\n;// @flow\n// Message: Flow file annotation not at the top of the file.\n\n;\n// @flow\n// Message: Flow file annotation not at the top of the file.\n\n// @Flow\n// Message: Malformed Flow file annotation.\n\n// @NoFlow\n// Message: Malformed Flow file annotation.\n\n// @Noflow\n// Message: Malformed Flow file annotation.\n\n// @floweeeeeee\n// Message: Misspelled or malformed Flow file annotation.\n\n// @nofloweeeeeee\n// Message: Misspelled or malformed Flow file annotation.\n\n// Options: [\"always\"]\na;\n// Message: Flow file annotation is missing.\n\n// Options: [\"always\",{\"annotationStyle\":\"line\"}]\n/* @flow */\n// Message: Flow file annotation style must be `// @flow`\n\n// Options: [\"always\",{\"annotationStyle\":\"block\"}]\n// @flow\n// Message: Flow file annotation style must be `/* @flow */`\n\n// Options: [\"always\",{\"annotationStyle\":\"block\"}]\n// @flow\n// Message: Flow file annotation style must be `/* @flow */`\n\n// Options: [\"always\",{\"annotationStyle\":\"line\",\"strict\":true}]\n// @flow\n// Message: Strict Flow file annotation is required, must be `// @flow strict`\n\n// Options: [\"always\",{\"annotationStyle\":\"line\"}]\n/* @noflow */\n// Message: Flow file annotation style must be `// @noflow`\n\n// Options: [\"always\",{\"annotationStyle\":\"block\"}]\n// @noflow\n// Message: Flow file annotation style must be `/* @noflow */`\n\n// Options: [\"always\"]\na;\n// Message: Flow file annotation is missing.\n\n// Options: [\"always\",{\"annotationStyle\":\"block\"}]\na;\n// Message: Flow file annotation is missing.\n\n// Options: [\"always\",{\"annotationStyle\":\"line\",\"strict\":true}]\na;\n// Message: Flow file annotation is missing.\n\n// Options: [\"always\",{\"annotationStyle\":\"line\",\"strict\":true}]\n// @flow\na;\nb;\n// Message: Strict Flow file annotation is required, must be `// @flow strict`\n\n// Options: [\"never\",{\"annotationStyle\":\"line\"}]\n/* @flow */\na;\nb;\n// Message: Flow file annotation style must be `// @flow`\n\n// Options: [\"never\",{\"annotationStyle\":\"line\"}]\n/* @flow strict */\na;\nb;\n// Message: Flow file annotation style must be `// @flow strict`\n```\n\nThe following patterns are not considered problems:\n\n```js\na;\n\n// @flow\na;\n\n//@flow\na;\n\n//**@flow\na;\n\n/* foo @flow bar */\na;\n\n\n\n// @flow\na;\n\n// @flow\n// @FLow\n\n// @noflow\na;\n\n// Options: [\"always\"]\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\na;\n\n// Options: [\"always\",{\"annotationStyle\":\"line\"}]\n// @flow\n\n// Options: [\"always\",{\"annotationStyle\":\"line\",\"strict\":true}]\n// @noflow\n\n// Options: [\"always\",{\"annotationStyle\":\"line\",\"strict\":true}]\n// @flow strict\n\n// Options: [\"never\",{\"annotationStyle\":\"none\"}]\n// @function\n\n// Options: [\"never\"]\n// @fixable\n\n// Options: [\"always\",{\"annotationStyle\":\"block\"}]\n/* @flow */\n```\n\n\n\n<a name=\"require-variable-type\"></a>\n### `require-variable-type`\n\nRequires that all variable declarators have type annotations.\n\n<a name=\"options\"></a>\n#### Options\n\nYou can exclude variables that match a certain regex by using `excludeVariableMatch`.\n\nThis excludes all parameters that start with an underscore (`_`).\nThe default pattern is `a^`, which doesn't match anything, i.e., all parameters are checked.\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/require-variable-type\": [\n            2,\n            {\n              \"excludeVariableMatch\": \"^_\"\n            }\n        ]\n    }\n}\n```\n\n\nYou can choose specific variable types (`var`, `let`, and `const`) to ignore using `excludeVariableTypes`.\n\nThis excludes `var` and `let` declarations from needing type annotations, but forces `const` declarations to have it.\nBy default, all declarations are checked.\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/require-variable-type\": [\n            2,\n            {\n              \"excludeVariableTypes\": {\n                \"var\": true,\n                \"let\": true,\n                \"const\": false,\n              }\n            }\n        ]\n    }\n}\n```\n\n\n\nThe following patterns are considered problems:\n\n```js\nvar foo = \"bar\"\n// Message: Missing \"foo\" variable type annotation.\n\nvar foo : string = \"bar\", bar = 1\n// Message: Missing \"bar\" variable type annotation.\n\n// Options: [{\"excludeVariableMatch\":\"^_\"}]\nvar _foo = \"bar\", bar = 1\n// Message: Missing \"bar\" variable type annotation.\n\n// Options: [{\"excludeVariableTypes\":{\"let\":false,\"var\":true}}]\nvar foo = \"bar\", bar = 1; const oob : string = \"oob\"; let hey = \"yah\"\n// Message: Missing \"hey\" variable type annotation.\n```\n\nThe following patterns are not considered problems:\n\n```js\nvar foo : string = \"bar\"\n\nvar foo : string = \"bar\", bar : number = 1\n\n// Options: [{\"excludeVariableMatch\":\"^_\"}]\nvar _foo = \"bar\", bar : number = 1\n\n// Options: [{\"excludeVariableTypes\":{\"var\":true}}]\nvar foo = \"bar\", bar = 1\n\n// Options: [{\"excludeVariableTypes\":{\"let\":true,\"var\":true}}]\nvar foo = \"bar\", bar = 1; const oob : string = \"oob\"; let hey = \"yah\"\n```\n\n\n\n<a name=\"semi\"></a>\n### `semi`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces consistent use of semicolons after type aliases.\n\nThis rule takes one argument. If it is `'never'` then a problem is raised when there is a semicolon after a type alias. If it is `'always'` then a problem is raised when there is no semicolon after a type alias.\n\nThe default value is `'always'`.\n\nThe following patterns are considered problems:\n\n```js\n// Options: [\"always\"]\nclass Foo { foo: string }\n// Message: Missing semicolon.\n\n// Options: [\"never\"]\nclass Foo { foo: string; }\n// Message: Extra semicolon.\n\n// Options: []\ntype FooType = {}\n// Message: Missing semicolon.\n\n// Options: [\"always\"]\ntype FooType = {}\n// Message: Missing semicolon.\n\n// Options: [\"never\"]\ntype FooType = {};\n// Message: Extra semicolon.\n\n// Options: []\nopaque type FooType = {}\n// Message: Missing semicolon.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype FooType = {};\n\n// Options: [\"always\"]\ntype FooType = {};\n\n// Options: [\"always\"]\n(foo: string) => {}\n\n// Options: [\"always\"]\nclass Foo { foo: string; }\n\n// Options: [\"never\"]\nclass Foo { foo: string }\n\n// Options: [\"always\"]\ntype FooType = { a: number;\n b: string;\n };\n\n// Options: [\"never\"]\ntype FooType = { a: number;\n b: string;\n }\n\n// Options: [\"never\"]\ntype FooType = {}\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ntype FooType = {}\n\nopaque type FooType = {};\n```\n\n\n\n<a name=\"sort-keys\"></a>\n### `sort-keys`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces natural, case-insensitive sorting of Object annotations.\n\n<a name=\"options\"></a>\n#### Options\n\nThe first option specifies sort order.\n\n* `\"asc\"` (default) - enforce ascending sort order.\n* `\"desc\"` - enforce descending sort order.\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/sort-keys\": [\n      2,\n      \"asc\"\n    ]\n  }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\ntype FooType = { a: number, c: number, b: string }\n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n// Options: [\"desc\"]\ntype FooType = { a: number, b: number }\n// Message: Expected type annotations to be in descending order. \"b\" must be before \"a\".\n\n// Options: [\"desc\"]\ntype FooType = { b: number, C: number, a: string }\n// Message: Expected type annotations to be in descending order. \"C\" must be before \"b\".\n\n// Options: [\"asc\"]\ntype FooType = { a: number, c: number, C: number, b: string }\n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"C\".\n\n// Options: [\"asc\"]\ntype FooType = { a: number, C: number, c: number, b: string }\n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n// Options: [\"asc\"]\ntype FooType = { 1: number, 10: number, 2: boolean }\n// Message: Expected type annotations to be in ascending order. \"2\" must be before \"10\".\n\ntype FooType = { a: number, c: number, b: string }\n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          a: number,\n          c: number,\n          b: string,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          a: $ReadOnlyArray<number>,\n          c: $ReadOnlyMap<string, number>,\n          b: Map<string, Array<Map<string, number>>>,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          ...ErrorsInRecursiveGenericTypeArgsButDoesNotFix<{\n            y: boolean,\n            x: string,\n            z: {\n              j: string,\n              l: number,\n              k: boolean,\n            },\n          }>,\n          a: number,\n          c: string,\n          b: Map<string, Array<ErrorsInRecursiveGenericTypeArgsButDoesNotFix<{\n            y: boolean,\n            x: string,\n            z: {\n              j: string,\n              l: number,\n              k: boolean,\n            },\n          }>>>,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"x\" must be before \"y\".\n// Message: Expected type annotations to be in ascending order. \"k\" must be before \"l\".\n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n// Message: Expected type annotations to be in ascending order. \"x\" must be before \"y\".\n// Message: Expected type annotations to be in ascending order. \"k\" must be before \"l\".\n\n\n        type FooType = {\n          ...BPreservesSpreadOrder,\n          ...APreservesSpreadOrder,\n          c: string,\n          b: number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          ...BPreservesSpreadSpans,\n          ...APreservesSpreadSpans,\n          c: string,\n          b: number,\n          ...CPreservesSpreadSpans,\n          e: string,\n          d: number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n// Message: Expected type annotations to be in ascending order. \"d\" must be before \"e\".\n\n\n        type FooType = {\n          ...BPreservesSpreadOrderAndTypeArgs<string, number>,\n          ...APreservesSpreadOrderAndTypeArgs<number>,\n          c: string,\n          b: number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          /* preserves block comment before spread BType */\n          // preserves line comment before spread BType\n          ... /* preserves comment in spread BType */ BType<Generic> /* preserves trailing comment in spread AType */,\n          /* preserves block comment before spread AType */\n          // preserves line comment before spread AType\n          ... /* preserves comment in spread AType */ AType /* preserves trailing comment in spread AType */,\n          /* preserves block comment before reordered key \"c\" */\n          // preserves line comment before reordered key \"c\"\n          c:/* preserves comment and white space or lack of it */string/* preserves trailing comment for key \"c\" */,\n          b: number,\n          dWithoutComma: boolean\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          +a: number,\n          c: number,\n          b: string,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          -a: number,\n          c: number,\n          b: string,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          a?: number,\n          c: ?number,\n          b: string,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          a: (number) => void,\n          c: number,\n          b: (param: string) => number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          a: number | string | boolean,\n          c: number,\n          b: (param: string) => number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          c: number,\n          a: number | string | boolean,\n          b: (param: string) => number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"a\" must be before \"c\".\n\n\n        type FooType = {\n          c: {\n            z: number,\n            x: string,\n            y: boolean,\n          },\n          a: number | string | boolean,\n          b: (param: string) => number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"x\" must be before \"z\".\n// Message: Expected type annotations to be in ascending order. \"a\" must be before \"c\".\n\n\n        type FooType = {\n          c: {\n            z: {\n              j: string,\n              l: number,\n              k: boolean,\n            },\n            x: string,\n            y: boolean,\n          },\n          a: number | string | boolean,\n          b: (param: string) => number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"k\" must be before \"l\".\n// Message: Expected type annotations to be in ascending order. \"x\" must be before \"z\".\n// Message: Expected type annotations to be in ascending order. \"a\" must be before \"c\".\n\n\n        type FooType = {\n          +c: number,\n          -b: number,\n          a: number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n// Message: Expected type annotations to be in ascending order. \"a\" must be before \"b\".\n\n\n        type FooType = {|\n          +c: number,\n          -b: number,\n          a: number,\n        |}\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n// Message: Expected type annotations to be in ascending order. \"a\" must be before \"b\".\n\n\n        type FooType = {\n          a(number): void,\n          c: number,\n          b(param: string): number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          a: number | string | boolean,\n          c: number,\n          b(param: string): number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        type FooType = {\n          c: number,\n          a: number | string | boolean,\n          b(param: string): number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"a\" must be before \"c\".\n\n\n        type FooType = {\n          c: {\n            z: number,\n            x: string,\n            y: boolean,\n          },\n          a: number | string | boolean,\n          b(param: string): number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"x\" must be before \"z\".\n// Message: Expected type annotations to be in ascending order. \"a\" must be before \"c\".\n\n\n        type FooType = {\n          c: {\n            z: {\n              j: string,\n              l: number,\n              k: boolean,\n            },\n            x: string,\n            y: boolean,\n          },\n          a: number | string | boolean,\n          b(param: string): number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"k\" must be before \"l\".\n// Message: Expected type annotations to be in ascending order. \"x\" must be before \"z\".\n// Message: Expected type annotations to be in ascending order. \"a\" must be before \"c\".\n\n\n        type FooType = {\n          /* preserves block comment before a */\n          a: number | string | boolean,\n          /* preserves block comment before c */\n          c: number,\n          /* preserves block comment before b */\n          b(param: string): number,\n        }\n      \n// Message: Expected type annotations to be in ascending order. \"b\" must be before \"c\".\n\n\n        export type GroupOrdersResponseType = {|\n          isSuccess: boolean,\n          code: number,\n          message?: string,\n          errorMessage: string,\n          result: {|\n            OrderNumber: string,\n            Orders: GroupOrderSummaryType[],\n            PlacedOn: string,\n            Status: string,\n            ReturnText: string,\n            IncludesLegacyOrder: boolean\n          |}\n        |};\n      \n// Message: Expected type annotations to be in ascending order. \"code\" must be before \"isSuccess\".\n// Message: Expected type annotations to be in ascending order. \"errorMessage\" must be before \"message\".\n// Message: Expected type annotations to be in ascending order. \"ReturnText\" must be before \"Status\".\n// Message: Expected type annotations to be in ascending order. \"IncludesLegacyOrder\" must be before \"ReturnText\".\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype FooType = { a: number }\n\ntype FooType = { a: number, b: number, c: (boolean | number) }\n\ntype FooType = { a: string, b: foo, C: number }\n\ntype FooType = { 1: number, 2: boolean, 10: number }\n\n// Options: [\"desc\"]\ntype FooType = { c: number, b: number, a: number }\n\n// Options: [\"desc\"]\ntype FooType = { C: number, b: string, a: {} }\n\n// Options: [\"desc\"]\ntype FooType = { 10: number, 2: number, 1: boolean }\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ntype FooType = { b: number, a: number }\n\ntype FooType = { a: string, b(): number, c: boolean }\n\ntype FooType = { a(): string, b: number, c: boolean }\n```\n\n\n\n<a name=\"sort-type-union-intersection-members\"></a>\n### `sort-type-union-intersection-members`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces that members of a type union/intersection are sorted alphabetically.\n\n<a name=\"options\"></a>\n#### Options\n\nYou can specify the sort order using `order`.\n\n* `\"asc\"` (default) - enforce ascending sort order.\n* `\"desc\"` - enforce descending sort order.\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/sort-type-union-intersection-members\": [\n      2,\n      {\n        \"order\": \"asc\"\n      }\n    ]\n  }\n}\n```\n\nYou can disable checking intersection types using `checkIntersections`.\n\n* `true` (default) - enforce sort order of intersection members.\n* `false` - do not enforce sort order of intersection members.\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/sort-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) - enforce sort order of union members.\n* `false` - do not enforce sort order of union members.\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/sort-type-union-intersection-members\": [\n      2,\n      {\n        \"checkUnions\": true\n      }\n    ]\n  }\n}\n```\n\nYou can specify the ordering of groups using `groupOrder`.\n\nEach member of the type is placed into a group, and then the rule sorts alphabetically within each group.\nThe ordering of groups is determined by this option.\n\n* `keyword` - Keyword types (`any`, `string`, etc)\n* `named` - Named types (`A`, `A['prop']`, `B[]`, `Array<C>`)\n* `literal` - Literal types (`1`, `'b'`, `true`, etc)\n* `function` - Function types (`() => void`)\n* `object` - Object types (`{ a: string }`, `{ [key: string]: number }`)\n* `tuple` - Tuple types (`[A, B, C]`)\n* `intersection` - Intersection types (`A & B`)\n* `union` - Union types (`A | B`)\n* `nullish` - `null` and `undefined`\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/sort-type-union-intersection-members\": [\n      2,\n      {\n        \"groupOrder\": [\n          'keyword',\n          'named',\n          'literal',\n          'function',\n          'object',\n          'tuple',\n          'intersection',\n          'union',\n          'nullish',\n        ]\n      }\n    ]\n  }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\ntype T1 = B | A;\n// Message: Expected union members to be in ascending order. \"A\" should be before \"B\".\n\ntype T2 = { b: string } & { a: string };\n// Message: Expected intersection members to be in ascending order. \"{ a: string }\" should be before \"{ b: string }\".\n\ntype T3 = [1, 2, 4] & [1, 2, 3];\n// Message: Expected intersection members to be in ascending order. \"[1, 2, 3]\" should be before \"[1, 2, 4]\".\n\n\n        type T4 =\n          | [1, 2, 4]\n          | [1, 2, 3]\n          | { b: string }\n          | { a: string }\n          | (() => void)\n          | (() => string)\n          | 'b'\n          | 'a'\n          | 'b'\n          | 'a'\n          | string[]\n          | number[]\n          | B\n          | A\n          | string\n          | any;\n      \n// Message: Expected union members to be in ascending order. \"[1, 2, 3]\" should be before \"[1, 2, 4]\".\n// Message: Expected union members to be in ascending order. \"{ b: string }\" should be before \"[1, 2, 3]\".\n// Message: Expected union members to be in ascending order. \"{ a: string }\" should be before \"{ b: string }\".\n// Message: Expected union members to be in ascending order. \"() => void\" should be before \"{ a: string }\".\n// Message: Expected union members to be in ascending order. \"() => string\" should be before \"() => void\".\n// Message: Expected union members to be in ascending order. \"'b'\" should be before \"() => string\".\n// Message: Expected union members to be in ascending order. \"'a'\" should be before \"'b'\".\n// Message: Expected union members to be in ascending order. \"'b'\" should be before \"'a'\".\n// Message: Expected union members to be in ascending order. \"'a'\" should be before \"'b'\".\n// Message: Expected union members to be in ascending order. \"string[]\" should be before \"'a'\".\n// Message: Expected union members to be in ascending order. \"number[]\" should be before \"string[]\".\n// Message: Expected union members to be in ascending order. \"B\" should be before \"number[]\".\n// Message: Expected union members to be in ascending order. \"A\" should be before \"B\".\n// Message: Expected union members to be in ascending order. \"string\" should be before \"A\".\n// Message: Expected union members to be in ascending order. \"any\" should be before \"string\".\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype T1 = A | B;\n\ntype T2 = { a: string } & { b: string };\n\ntype T3 = [1, 2, 3] & [1, 2, 4];\n\n\n        type T4 =\n          | any\n          | string\n          | A\n          | B\n          | number[]\n          | string[]\n          | 'a'\n          | 'a'\n          | 'b'\n          | 'b'\n          | (() => string)\n          | (() => void)\n          | { a: string }\n          | { b: string }\n          | [1, 2, 3]\n          | [1, 2, 4];\n      \n```\n\n\n\n<a name=\"space-after-type-colon\"></a>\n### `space-after-type-colon`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces consistent spacing after the type annotation colon.\n\n<a name=\"options\"></a>\n#### Options\n\nThis rule has a string argument.\n\n* `\"always\"` (default): Require a space after the type annotation colon (e.g. foo: BarType).\n* `\"never\"`: Require no spaces after the type annotation colon (e.g. foo:BarType).\n\nThis rule has an option object.\n\n* `\"allowLineBreak\"` - Allow a line break to count as a space following the annotation colon.\n    * `\"true\"`: Enable\n    * `\"false\"`: Disable\n\n```js\n{\n  \"rules\": {\n    \"ft-flow/space-after-type-colon\": [\n      2,\n      \"always\", {\n        \"allowLineBreak\": false\n      }\n    ]\n  }\n}\n```\n\nThe following patterns are considered problems:\n\n```js\n// Options: [\"never\"]\n(foo: string) => {}\n// Message: There must be no space after \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\n(foo:  string) => {}\n// Message: There must be 1 space after \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\n(foo:(() => void)) => {}\n// Message: There must be a space after \"foo\" parameter type annotation colon.\n\n// Options: [\"never\"]\n(foo: (() => void)) => {}\n// Message: There must be no space after \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\n(foo:  (() => void)) => {}\n// Message: There must be 1 space after \"foo\" parameter type annotation colon.\n\n({ lorem, ipsum, dolor } :   SomeType) => {}\n// Message: There must be 1 space after \"{ lorem, ipsum, dolor }\" parameter type annotation colon.\n\n(foo:{ a: string, b: number }) => {}\n// Message: There must be a space after \"foo\" parameter type annotation colon.\n\n({ a, b } :{ a: string, b: number }) => {}\n// Message: There must be a space after \"{ a, b }\" parameter type annotation colon.\n\n([ a, b ] :string[]) => {}\n// Message: There must be a space after \"[ a, b ]\" parameter type annotation colon.\n\n(i?:number) => {}\n// Message: There must be a space after \"i\" parameter type annotation colon.\n\n(i?:  number) => {}\n// Message: There must be 1 space after \"i\" parameter type annotation colon.\n\n// Options: [\"never\"]\n(i?: number) => {}\n// Message: There must be no space after \"i\" parameter type annotation colon.\n\n(foo:\n  { a: string, b: number }) => {}\n// Message: There must not be a line break after \"foo\" parameter type annotation colon.\n\n(foo:\n{ a: string, b: number }) => {}\n// Message: There must not be a line break after \"foo\" parameter type annotation colon.\n\n(foo: \n{ a: string, b: number }) => {}\n// Message: There must not be a line break after \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\n():Object => {}\n// Message: There must be a space after return type colon.\n\n// Options: [\"never\"]\n(): Object => {}\n// Message: There must be no space after return type colon.\n\n// Options: [\"always\"]\n():  Object => {}\n// Message: There must be 1 space after return type colon.\n\n// Options: [\"always\"]\n():(() => void) => {}\n// Message: There must be a space after return type colon.\n\n// Options: [\"never\"]\n(): (() => void) => {}\n// Message: There must be no space after return type colon.\n\n// Options: [\"always\"]\n():  (() => void) => {}\n// Message: There must be 1 space after return type colon.\n\n// Options: [\"never\"]\nexport default function (foo: string) {}\n// Message: There must be no space after \"foo\" parameter type annotation colon.\n\n// Options: [\"never\"]\nfunction foo (foo: string) {}\n// Message: There must be no space after \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\n(foo:string) => {}\n// Message: There must be a space after \"foo\" parameter type annotation colon.\n\nfunction foo (foo:string) {}\n// Message: There must be a space after \"foo\" parameter type annotation colon.\n\nasync function foo({ lorem, ipsum, dolor }:SomeType) {}\n// Message: There must be a space after \"{ lorem, ipsum, dolor }\" parameter type annotation colon.\n\nfunction x(i?:number) {}\n// Message: There must be a space after \"i\" parameter type annotation colon.\n\nfunction x(i?:  number) {}\n// Message: There must be 1 space after \"i\" parameter type annotation colon.\n\n// Options: [\"never\"]\nfunction x(i?: number) {}\n// Message: There must be no space after \"i\" parameter type annotation colon.\n\nfunction a():x {}\n// Message: There must be a space after return type colon.\n\n// Options: [\"always\"]\nfunction a():  x {}\n// Message: There must be 1 space after return type colon.\n\n// Options: [\"never\"]\nfunction a(): x {}\n// Message: There must be no space after return type colon.\n\ntype X = (foo:number) => string\n// Message: There must be a space after \"foo\" parameter type annotation colon.\n\n// Options: [\"never\"]\ntype X = (foo: number) => string\n// Message: There must be no space after \"foo\" parameter type annotation colon.\n\ntype X = (foo:  number) => string\n// Message: There must be 1 space after \"foo\" parameter type annotation colon.\n\ntype X = (foo:?number) => string\n// Message: There must be a space after \"foo\" parameter type annotation colon.\n\ntype X = (foo:(number)) => string\n// Message: There must be a space after \"foo\" parameter type annotation colon.\n\ntype X = (foo:((number))) => string\n// Message: There must be a space after \"foo\" parameter type annotation colon.\n\ntype X = (foo:  ((number))) => string\n// Message: There must be 1 space after \"foo\" parameter type annotation colon.\n\n// Options: [\"never\"]\ntype X = (foo: ((number))) => string\n// Message: There must be no space after \"foo\" parameter type annotation colon.\n\ntype X = (foo:?(number)) => string\n// Message: There must be a space after \"foo\" parameter type annotation colon.\n\ntype TArrayPredicate = (el: T, i?:number) => boolean\n// Message: There must be a space after \"i\" parameter type annotation colon.\n\ntype TArrayPredicate = (el: T, i?:  number) => boolean\n// Message: There must be 1 space after \"i\" parameter type annotation colon.\n\n// Options: [\"never\"]\ntype TArrayPredicate = (el:T, i?: number) => boolean\n// Message: There must be no space after \"i\" parameter type annotation colon.\n\nclass X { foo:string }\n// Message: There must be a space after \"foo\" class property type annotation colon.\n\n// Options: [\"never\"]\nclass X { foo: string }\n// Message: There must be no space after \"foo\" class property type annotation colon.\n\nclass X { foo:?string }\n// Message: There must be a space after \"foo\" class property type annotation colon.\n\n// Options: [\"never\"]\nclass X { foo: ?string }\n// Message: There must be no space after \"foo\" class property type annotation colon.\n\nclass X { static foo:number }\n// Message: There must be a space after \"foo\" class property type annotation colon.\n\n// Options: [\"never\"]\nclass X { static foo: number }\n// Message: There must be no space after \"foo\" class property type annotation colon.\n\nclass X { static foo :number }\n// Message: There must be a space after \"foo\" class property type annotation colon.\n\n// Options: [\"never\"]\nclass X { static foo : number }\n// Message: There must be no space after \"foo\" class property type annotation colon.\n\ndeclare class X { static foo:number }\n// Message: There must be a space after \"foo\" type annotation colon.\n\n// Options: [\"never\"]\ndeclare class X { static foo: number }\n// Message: There must be no space after \"foo\" type annotation colon.\n\ndeclare class X { static foo :number }\n// Message: There must be a space after \"foo\" type annotation colon.\n\n// Options: [\"never\"]\ndeclare class X { static foo : number }\n// Message: There must be no space after \"foo\" type annotation colon.\n\nclass X { +foo:string }\n// Message: There must be a space after \"foo\" class property type annotation colon.\n\nclass X { +foo:  string }\n// Message: There must be 1 space after \"foo\" class property type annotation colon.\n\n// Options: [\"never\"]\nclass X { +foo: string }\n// Message: There must be no space after \"foo\" class property type annotation colon.\n\nclass X { static +foo:string }\n// Message: There must be a space after \"foo\" class property type annotation colon.\n\nclass X { static +foo:  string }\n// Message: There must be 1 space after \"foo\" class property type annotation colon.\n\n// Options: [\"never\"]\nclass X { static +foo: string }\n// Message: There must be no space after \"foo\" class property type annotation colon.\n\ntype X = { foo:string }\n// Message: There must be a space after \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { foo:string }\n// Message: There must be a space after \"foo\" type annotation colon.\n\n// Options: [\"never\"]\ntype X = { foo: string }\n// Message: There must be no space after \"foo\" type annotation colon.\n\ntype X = { foo:  string }\n// Message: There must be 1 space after \"foo\" type annotation colon.\n\ntype X = { foo?:string }\n// Message: There must be a space after \"foo\" type annotation colon.\n\n// Options: [\"never\"]\ntype X = { foo?: string }\n// Message: There must be no space after \"foo\" type annotation colon.\n\ntype X = { foo?:?string }\n// Message: There must be a space after \"foo\" type annotation colon.\n\ntype X = { foo?:  ?string }\n// Message: There must be 1 space after \"foo\" type annotation colon.\n\ntype Foo = { barType:(string | () => void) }\n// Message: There must be a space after \"barType\" type annotation colon.\n\ntype Foo = { barType:(((string | () => void))) }\n// Message: There must be a space after \"barType\" type annotation colon.\n\n// Options: [\"never\"]\ntype Foo = { barType: (string | () => void) }\n// Message: There must be no space after \"barType\" type annotation colon.\n\ntype Foo = { barType:  (string | () => void) }\n// Message: There must be 1 space after \"barType\" type annotation colon.\n\ntype Foo = { barType:  ((string | () => void)) }\n// Message: There must be 1 space after \"barType\" type annotation colon.\n\ntype X = { get:() => A; }\n// Message: There must be a space after \"get\" type annotation colon.\n\ntype X = { get:<X>() => A; }\n// Message: There must be a space after \"get\" type annotation colon.\n\n// Options: [\"never\"]\ntype X = { get: () => A; }\n// Message: There must be no space after \"get\" type annotation colon.\n\n// Options: [\"never\"]\ntype X = { get: <X>() => A; }\n// Message: There must be no space after \"get\" type annotation colon.\n\ntype X = { get:  () => A; }\n// Message: There must be 1 space after \"get\" type annotation colon.\n\ntype X = { get:  <X>() => A; }\n// Message: There must be 1 space after \"get\" type annotation colon.\n\ntype X = { +foo:string }\n// Message: There must be a space after \"foo\" type annotation colon.\n\ntype X = { +foo:  string }\n// Message: There must be 1 space after \"foo\" type annotation colon.\n\n// Options: [\"never\"]\ntype X = { +foo: string }\n// Message: There must be no space after \"foo\" type annotation colon.\n\ntype X = { +foo?:string }\n// Message: There must be a space after \"foo\" type annotation colon.\n\ntype X = { +foo?:  string }\n// Message: There must be 1 space after \"foo\" type annotation colon.\n\n// Options: [\"never\"]\ntype X = { +foo?: string }\n// Message: There must be no space after \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a:b]: c }\n// Message: There must be a space after type annotation colon.\n\n// Options: [\"never\"]\ntype X = { [a: b]:c }\n// Message: There must be no space after type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a:    b]: c }\n// Message: There must be 1 space after type annotation colon.\n\n// Options: [\"always\"]\ntype X = { +[a:b]: c }\n// Message: There must be a space after type annotation colon.\n\n// Options: [\"never\"]\ntype X = { +[a: b]:c }\n// Message: There must be no space after type annotation colon.\n\n// Options: [\"always\"]\ntype X = { +[a:    b]: c }\n// Message: There must be 1 space after type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a: b]:c }\n// Message: There must be a space after type annotation colon.\n\n// Options: [\"never\"]\ntype X = { [a:b]: c }\n// Message: There must be no space after type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a: b]:    c }\n// Message: There must be 1 space after type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a:b]:c }\n// Message: There must be a space after type annotation colon.\n// Message: There must be a space after type annotation colon.\n\n// Options: [\"never\"]\ntype X = { [a: b]: c }\n// Message: There must be no space after type annotation colon.\n// Message: There must be no space after type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a:  b]:  c }\n// Message: There must be 1 space after type annotation colon.\n// Message: There must be 1 space after type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a:(b)]:(c) }\n// Message: There must be a space after type annotation colon.\n// Message: There must be a space after type annotation colon.\n\n// Options: [\"never\"]\ntype X = { [a: (b)]: (c) }\n// Message: There must be no space after type annotation colon.\n// Message: There must be no space after type annotation colon.\n\n// Options: [\"never\"]\nconst x = ({}: {})\n// Message: There must be no space after type cast colon.\n\n// Options: [\"always\"]\nconst x = ({}:{})\n// Message: There must be a space after type cast colon.\n\n// Options: [\"always\"]\nconst x = ({}:  {})\n// Message: There must be 1 space after type cast colon.\n\n// Options: [\"never\"]\n((x): (string))\n// Message: There must be no space after type cast colon.\n\n// Options: [\"always\"]\n((x):(string))\n// Message: There must be a space after type cast colon.\n\n// Options: [\"always\"]\n((x):  (string))\n// Message: There must be 1 space after type cast colon.\n\n// Options: [\"always\"]\nconst x:number = 7;\n// Message: There must be a space after const type annotation colon.\n\n// Options: [\"always\"]\nlet x:number = 42;\n// Message: There must be a space after let type annotation colon.\n\n// Options: [\"always\"]\nvar x:number = 42;\n// Message: There must be a space after var type annotation colon.\n```\n\nThe following patterns are not considered problems:\n\n```js\n(foo) => {}\n\n(foo: string) => {}\n\n(foo: (string|number)) => {}\n\n// Options: [\"never\"]\n(foo:string) => {}\n\n// Options: [\"always\"]\n(foo: string) => {}\n\n// Options: [\"never\"]\n(foo:(() => void)) => {}\n\n// Options: [\"always\"]\n(foo: (() => void)) => {}\n\n({ lorem, ipsum, dolor }: SomeType) => {}\n\n(foo: { a: string, b: number }) => {}\n\n({ a, b }: ?{ a: string, b: number }) => {}\n\n([ a, b ]: string[]) => {}\n\n(i?: number) => {}\n\n// Options: [\"never\"]\n(i?:number) => {}\n\n// Options: [\"always\",{\"allowLineBreak\":true}]\n(foo:\n  { a: string, b: number }) => {}\n\n// Options: [\"always\",{\"allowLineBreak\":true}]\n(foo:\r\n  { a: string, b: number }) => {}\n\n// Options: [\"never\"]\n():Object => {}\n\n// Options: [\"always\"]\n(): Object => {}\n\n// Options: [\"never\"]\n():(number | string) => {}\n\n// Options: [\"always\"]\n(): (number | string) => {}\n\n// Options: [\"never\"]\n():number|string => {}\n\n// Options: [\"always\"]\n(): number|string => {}\n\n// Options: [\"never\"]\n():(() => void) => {}\n\n// Options: [\"always\"]\n(): (() => void) => {}\n\n// Options: [\"never\"]\n():( () => void ) => {}\n\n// Options: [\"always\"]\n(): ( () => void ) => {}\n\n(): { a: number, b: string } => {}\n\n// Options: [\"never\"]\n() :{ a:number, b:string } => {}\n\nfunction x(foo: string) {}\n\nclass Foo { constructor(foo: string) {} }\n\n// Options: [\"never\"]\nfunction x(foo:string) {}\n\n// Options: [\"never\"]\nclass Foo { constructor(foo:string) {} }\n\nasync function foo({ lorem, ipsum, dolor }: SomeType) {}\n\nfunction x({ a, b }: { a: string, b: number }) {}\n\nfunction x(i?: number) {}\n\n// Options: [\"never\"]\nfunction x(i?:number) {}\n\nfunction a(): x {}\n\n// Options: [\"never\"]\nfunction a():x {}\n\nfunction a(): (number | string) {}\n\n// Options: [\"never\"]\nfunction a() :(number | string) {}\n\ntype X = (foo: number) => string;\n\ntype X = (foo : number) => string;\n\ntype X = (foo: ?number) => string;\n\ntype X = (foo? : ?number) => string;\n\ntype X = (foo: ?{ x: number }) => string;\n\n// Options: [\"never\"]\ntype X = (foo:number) => string;\n\n// Options: [\"never\"]\ntype X = (foo:?{ x:number }) => string;\n\ntype X = (foo: (number)) => string\n\ntype X = (foo: ((number))) => string\n\n// Options: [\"never\"]\ntype X = (foo:((number))) => string\n\ntype X = ?(foo: ((number))) => string\n\n// Options: [\"never\"]\ntype X = ?(foo:((number))) => string\n\ntype TArrayPredicate = (el: T, i?: number) => boolean\n\n// Options: [\"never\"]\ntype TArrayPredicate = (el:T, i?:number) => boolean\n\ntype X = (number) => string;\n\ntype X = (?number) => string;\n\ntype X = number => string;\n\ntype X = ?number => string;\n\ntype X = ({ foo: bar }) => string;\n\n// Options: [\"always\"]\ntype X = (number) => string;\n\n// Options: [\"always\"]\ntype X = (?number) => string;\n\n// Options: [\"always\"]\ntype X = number => string;\n\n// Options: [\"always\"]\ntype X = ?number => string;\n\n// Options: [\"always\"]\ntype X = ({ foo: bar }) => string;\n\nclass Foo { bar }\n\nclass Foo { bar = 3 }\n\nclass Foo { bar: string }\n\nclass Foo { bar: ?string }\n\n// Options: [\"never\"]\nclass Foo { bar:string }\n\n// Options: [\"never\"]\nclass Foo { bar:?string }\n\nclass X { static foo : number }\n\n// Options: [\"never\"]\nclass X { static foo :number }\n\ndeclare class X { static foo : number }\n\n// Options: [\"never\"]\ndeclare class X { static foo :number }\n\nclass X { +foo: string }\n\nclass X { static +foo: string }\n\n// Options: [\"never\"]\nclass X { +foo:string }\n\n// Options: [\"never\"]\nclass X { static +foo:string }\n\ntype X = { foo: string }\n\n// Options: [\"never\"]\ntype X = { foo:string }\n\ntype X = { foo?: string }\n\ntype X = { foo?: ?string }\n\n// Options: [\"never\"]\ntype X = { foo?:?string }\n\ntype Foo = { barType: (string | () => void) }\n\ntype Foo = { barType: ((string | () => void)) }\n\n// Options: [\"never\"]\ntype Foo = { barType:(string | () => void) }\n\n// Options: [\"never\"]\ntype Foo = { barType:((string | () => void)) }\n\ntype X = { get(): A; }\n\ntype X = { get<X>(): A; }\n\n// Options: [\"never\"]\ntype X = { get(): A; }\n\n// Options: [\"never\"]\ntype X = { get<X>(): A; }\n\ntype X = { get: () => A; }\n\ntype X = { get: <X>() => A; }\n\n// Options: [\"never\"]\ntype X = { get:() => A; }\n\n// Options: [\"never\"]\ntype X = { get:<X>() => A; }\n\ntype X = { +foo: string }\n\ntype X = { +foo?: string }\n\n// Options: [\"never\"]\ntype X = { +foo:string }\n\n// Options: [\"never\"]\ntype X = { +foo?:string }\n\n// Options: [\"always\"]\ntype X = { [a: b]: c }\n\n// Options: [\"never\"]\ntype X = { [a:b]:c }\n\n// Options: [\"always\"]\ntype X = { +[a: b]: c }\n\n// Options: [\"never\"]\ntype X = { +[a:b]:c }\n\n// Options: [\"always\"]\ntype X = { [string]: c }\n\n// Options: [\"never\"]\ntype X = { [string]:c }\n\n// Options: [\"never\"]\nconst x = ({}:{})\n\n// Options: [\"always\"]\nconst x = ({}: {})\n\n// Options: [\"never\"]\n((x):(string))\n\n// Options: [\"always\"]\n((x): (string))\n\n// Options: [\"always\"]\nconst x: number = 7;\n\n// Options: [\"always\"]\nlet x: number = 42;\n\n// Options: [\"always\"]\nvar x: number = 42;\n```\n\n\n\n<a name=\"space-before-generic-bracket\"></a>\n### `space-before-generic-bracket`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces consistent spacing before the opening `<` of generic type annotation parameters.\n\nThis rule takes one argument. If it is `'never'` then a problem is raised when there is a space before the `<`. If it is `'always'` then a problem is raised when there is no space before the `<`.\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 before \"Promise\" generic type annotation bracket\n\n// Options: [\"never\"]\ntype X = Promise <string>\n// Message: There must be no space before \"Promise\" generic type annotation bracket\n\ntype X = Promise  <string>\n// Message: There must be no space before \"Promise\" generic type annotation bracket\n\n// Options: [\"always\"]\ntype X = Promise<string>\n// Message: There must be a space before \"Promise\" generic type annotation bracket\n\n// Options: [\"always\"]\ntype X = Promise  <string>\n// Message: There must be one space before \"Promise\" generic type annotation bracket\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype X = Promise<string>\n\n// Options: [\"always\"]\ntype X = Promise <string>\n```\n\n\n\n<a name=\"space-before-type-colon\"></a>\n### `space-before-type-colon`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces consistent spacing before the type annotation colon.\n\nThis rule takes one argument. If it is `'always'` then a problem is raised when there is no space before the type annotation colon. If it is `'never'` then a problem is raised when there is a space before the type annotation colon. The default value is `'never'`.\n\nThe following patterns are considered problems:\n\n```js\n// Options: [\"never\"]\n(foo : string) => {}\n// Message: There must be no space before \"foo\" parameter type annotation colon.\n\n// Options: [\"never\"]\n(foo ? : string) => {}\n// Message: There must be no space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\n(foo: string) => {}\n// Message: There must be a space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\n(foo  : string) => {}\n// Message: There must be 1 space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\n(foo?: string) => {}\n// Message: There must be a space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\n(foo ?  : string) => {}\n// Message: There must be 1 space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\n(foo  ?: string) => {}\n// Message: There must be a space before \"foo\" parameter type annotation colon.\n\n({ lorem, ipsum, dolor } : SomeType) => {}\n// Message: There must be no space before \"{ lorem, ipsum, dolor }\" parameter type annotation colon.\n\n(foo : { a: string, b: number }) => {}\n// Message: There must be no space before \"foo\" parameter type annotation colon.\n\n({ a, b } : { a: string, b: number }) => {}\n// Message: There must be no space before \"{ a, b }\" parameter type annotation colon.\n\n([ a, b ] : string[]) => {}\n// Message: There must be no space before \"[ a, b ]\" parameter type annotation colon.\n\n() : x => {}\n// Message: There must be no space before return type colon.\n\n// Options: [\"always\"]\n(): x => {}\n// Message: There must be a space before return type colon.\n\n// Options: [\"always\"]\n()  : x => {}\n// Message: There must be 1 space before return type colon.\n\nfunction x(foo : string) {}\n// Message: There must be no space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\nfunction x(foo: string) {}\n// Message: There must be a space before \"foo\" parameter type annotation colon.\n\nvar x = function (foo : string) {}\n// Message: There must be no space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\nvar x = function (foo: string) {}\n// Message: There must be a space before \"foo\" parameter type annotation colon.\n\nclass Foo { constructor(foo : string ) {} }\n// Message: There must be no space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\nclass Foo { constructor(foo: string ) {} }\n// Message: There must be a space before \"foo\" parameter type annotation colon.\n\nasync function foo({ lorem, ipsum, dolor } : SomeType) {}\n// Message: There must be no space before \"{ lorem, ipsum, dolor }\" parameter type annotation colon.\n\nfunction a() : x {}\n// Message: There must be no space before return type colon.\n\n// Options: [\"always\"]\nfunction a(): x {}\n// Message: There must be a space before return type colon.\n\n// Options: [\"always\"]\nfunction a()  : x {}\n// Message: There must be 1 space before return type colon.\n\ntype X = (foo :string) => string;\n// Message: There must be no space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\ntype X = (foo:string) => string;\n// Message: There must be a space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\ntype X = (foo  :string) => string;\n// Message: There must be 1 space before \"foo\" parameter type annotation colon.\n\ntype X = (foo? :string) => string;\n// Message: There must be no space before \"foo\" parameter type annotation colon.\n\ntype X = (foo?     :string) => string;\n// Message: There must be no space before \"foo\" parameter type annotation colon.\n\n// Options: [\"always\"]\ntype X = (foo?:string) => string;\n// Message: There must be a space before \"foo\" parameter type annotation colon.\n\ntype X = (foo? :?string) => string;\n// Message: There must be no space before \"foo\" parameter type annotation colon.\n\nclass X { foo :string }\n// Message: There must be no space before \"foo\" class property type annotation colon.\n\n// Options: [\"always\"]\nclass X { foo: string }\n// Message: There must be a space before \"foo\" class property type annotation colon.\n\nclass X { foo :?string }\n// Message: There must be no space before \"foo\" class property type annotation colon.\n\n// Options: [\"always\"]\nclass X { foo: ?string }\n// Message: There must be a space before \"foo\" class property type annotation colon.\n\nclass X { static foo : number }\n// Message: There must be no space before \"foo\" class property type annotation colon.\n\nclass X { static foo :number }\n// Message: There must be no space before \"foo\" class property type annotation colon.\n\n// Options: [\"always\"]\nclass X { static foo: number }\n// Message: There must be a space before \"foo\" class property type annotation colon.\n\n// Options: [\"always\"]\nclass X { static foo:number }\n// Message: There must be a space before \"foo\" class property type annotation colon.\n\ndeclare class Foo { static bar :number; }\n// Message: There must be no space before \"bar\" type annotation colon.\n\ndeclare class Foo { static bar : number; }\n// Message: There must be no space before \"bar\" type annotation colon.\n\n// Options: [\"always\"]\ndeclare class Foo { static bar:number; }\n// Message: There must be a space before \"bar\" type annotation colon.\n\n// Options: [\"always\"]\ndeclare class Foo { static bar: number; }\n// Message: There must be a space before \"bar\" type annotation colon.\n\n// Options: [\"always\"]\nclass X { +foo: string }\n// Message: There must be a space before \"foo\" class property type annotation colon.\n\n// Options: [\"always\"]\nclass X { +foo  : string }\n// Message: There must be 1 space before \"foo\" class property type annotation colon.\n\n// Options: [\"never\"]\nclass X { +foo : string }\n// Message: There must be no space before \"foo\" class property type annotation colon.\n\n// Options: [\"always\"]\nclass X { static +foo: string }\n// Message: There must be a space before \"foo\" class property type annotation colon.\n\n// Options: [\"always\"]\nclass X { static +foo  : string }\n// Message: There must be 1 space before \"foo\" class property type annotation colon.\n\n// Options: [\"never\"]\nclass X { static +foo : string }\n// Message: There must be no space before \"foo\" class property type annotation colon.\n\ntype X = { foo : string }\n// Message: There must be no space before \"foo\" type annotation colon.\n\n// Options: [\"never\"]\ntype X = { foo : string }\n// Message: There must be no space before \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { foo: string }\n// Message: There must be a space before \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { foo  : string }\n// Message: There must be 1 space before \"foo\" type annotation colon.\n\ntype X = { foo? : string }\n// Message: There must be no space before \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { foo?: string }\n// Message: There must be a space before \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { foo?  : string }\n// Message: There must be 1 space before \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { foo   ?: string }\n// Message: There must be a space before \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { +foo: string }\n// Message: There must be a space before \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { +foo  : string }\n// Message: There must be 1 space before \"foo\" type annotation colon.\n\n// Options: [\"never\"]\ntype X = { +foo : string }\n// Message: There must be no space before \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { +foo?: string }\n// Message: There must be a space before \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { +foo?  : string }\n// Message: There must be 1 space before \"foo\" type annotation colon.\n\n// Options: [\"never\"]\ntype X = { +foo? : string }\n// Message: There must be no space before \"foo\" type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a: b] : c }\n// Message: There must be a space before type annotation colon.\n\n// Options: [\"never\"]\ntype X = { [a : b]: c }\n// Message: There must be no space before type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a  : b] : c }\n// Message: There must be 1 space before type annotation colon.\n\n// Options: [\"always\"]\ntype X = { +[a:b] : c }\n// Message: There must be a space before type annotation colon.\n\n// Options: [\"never\"]\ntype X = { +[a : b]: c }\n// Message: There must be no space before type annotation colon.\n\n// Options: [\"always\"]\ntype X = { +[a  : b] : c }\n// Message: There must be 1 space before type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a : b]: c }\n// Message: There must be a space before type annotation colon.\n\n// Options: [\"never\"]\ntype X = { [a: b] : c }\n// Message: There must be no space before type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a : b]  : c }\n// Message: There must be 1 space before type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a:b]:c }\n// Message: There must be a space before type annotation colon.\n// Message: There must be a space before type annotation colon.\n\n// Options: [\"never\"]\ntype X = { [a : b] : c }\n// Message: There must be no space before type annotation colon.\n// Message: There must be no space before type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a  : b]  : c }\n// Message: There must be 1 space before type annotation colon.\n// Message: There must be 1 space before type annotation colon.\n\n// Options: [\"always\"]\ntype X = { [a:(b)]:(c) }\n// Message: There must be a space before type annotation colon.\n// Message: There must be a space before type annotation colon.\n\n// Options: [\"never\"]\ntype X = { [a : (b)] : (c) }\n// Message: There must be no space before type annotation colon.\n// Message: There must be no space before type annotation colon.\n\n// Options: [\"never\"]\nconst x = ({} :{})\n// Message: There must be no space before type cast colon.\n\n// Options: [\"always\"]\nconst x = ({}:{})\n// Message: There must be a space before type cast colon.\n\n// Options: [\"always\"]\nconst x = ({}  :{})\n// Message: There must be 1 space before type cast colon.\n\n// Options: [\"never\"]\n((x) : string)\n// Message: There must be no space before type cast colon.\n\n// Options: [\"always\"]\n((x): string)\n// Message: There must be a space before type cast colon.\n\n// Options: [\"always\"]\n((x)  : string)\n// Message: There must be 1 space before type cast colon.\n\n// Options: [\"always\"]\nconst x:number = 7;\n// Message: There must be a space before const type annotation colon.\n\n// Options: [\"always\"]\nlet x:number = 42;\n// Message: There must be a space before let type annotation colon.\n\n// Options: [\"always\"]\nvar x:number = 42;\n// Message: There must be a space before var type annotation colon.\n```\n\nThe following patterns are not considered problems:\n\n```js\n(foo) => {}\n\n(foo: string) => {}\n\n(foo?: string) => {}\n\n(foo ?: string) => {}\n\n// Options: [\"never\"]\n(foo: string) => {}\n\n// Options: [\"always\"]\n(foo : string) => {}\n\n// Options: [\"always\"]\n(foo? : string) => {}\n\n// Options: [\"always\"]\n(foo ? : string) => {}\n\n// Options: [\"always\"]\n(foo  ? : string) => {}\n\n({ lorem, ipsum, dolor }: SomeType) => {}\n\n(foo: { a: string, b: number }) => {}\n\n({ a, b }: ?{ a: string, b: number }) => {}\n\n(): { a: number, b: string } => {}\n\n// Options: [\"always\"]\n() : { a : number, b : string } => {}\n\n([ a, b ]: string[]) => {}\n\n(): x => {}\n\n// Options: [\"always\"]\n() : x => {}\n\n(): (number | string) => {}\n\n// Options: [\"always\"]\n() : (number | string) => {}\n\nfunction x(foo: string) {}\n\n// Options: [\"always\"]\nfunction x(foo : string) {}\n\nvar x = function (foo: string) {}\n\n// Options: [\"always\"]\nvar x = function (foo : string) {}\n\nclass X { foo({ bar }: Props = this.props) {} }\n\nclass Foo { constructor(foo: string ) {} }\n\n// Options: [\"always\"]\nclass Foo { constructor(foo : string ) {} }\n\nasync function foo({ lorem, ipsum, dolor }: SomeType) {}\n\nfunction x({ a, b }: { a: string, b: number }) {}\n\nfunction a(): x {}\n\n// Options: [\"always\"]\nfunction a() : x {}\n\nfunction a(): (number | string) {}\n\n// Options: [\"always\"]\nfunction a() : (number | string) {}\n\ntype X = (foo:string) => number;\n\ntype X = (foo: string) => number;\n\ntype X = (foo: ?string) => number;\n\ntype X = (foo?: string) => number;\n\ntype X = (foo?: ?string) => number;\n\ntype X = (foo   ?: string) => number;\n\n// Options: [\"always\"]\ntype X = (foo? : string) => number\n\n// Options: [\"always\"]\ntype X = (foo? : ?string) => number\n\ntype X = (number) => string;\n\ntype X = (?number) => string;\n\ntype X = number => string;\n\ntype X = ?number => string;\n\ntype X = ({ foo: bar }) => string;\n\n// Options: [\"always\"]\ntype X = (number) => string;\n\n// Options: [\"always\"]\ntype X = (?number) => string;\n\n// Options: [\"always\"]\ntype X = number => string;\n\n// Options: [\"always\"]\ntype X = ?number => string;\n\n// Options: [\"always\"]\ntype X = ({ foo : bar }) => string;\n\nclass Foo { bar }\n\nclass Foo { bar = 3 }\n\nclass Foo { bar: string }\n\nclass Foo { bar: ?string }\n\nclass Foo { bar:?string }\n\n// Options: [\"always\"]\nclass Foo { bar : string }\n\nclass X { static foo:number }\n\nclass X { static foo: number }\n\n// Options: [\"always\"]\nclass X { static foo :number }\n\n// Options: [\"always\"]\nclass X { static foo : number }\n\ndeclare class Foo { static bar:number; }\n\n// Options: [\"always\"]\ndeclare class Foo { static bar :number; }\n\ndeclare class Foo { static bar: number; }\n\n// Options: [\"always\"]\ndeclare class Foo { static bar : number; }\n\nclass X { +foo: string }\n\nclass X { static +foo: string }\n\n// Options: [\"always\"]\nclass X { +foo : string }\n\n// Options: [\"always\"]\nclass X { static +foo : string }\n\ntype X = { foo: string }\n\n// Options: [\"always\"]\ntype X = { foo : string }\n\ntype X = { foo?: string }\n\ntype X = { foo   ?: string }\n\n// Options: [\"always\"]\ntype X = { foo? : string }\n\ntype X = { +foo: string }\n\ntype X = { +foo?: string }\n\n// Options: [\"always\"]\ntype X = { +foo : string }\n\n// Options: [\"always\"]\ntype X = { +foo? : string }\n\n// Options: [\"always\"]\ntype X = { [a : b] : c }\n\n// Options: [\"never\"]\ntype X = { [a:b]:c }\n\n// Options: [\"always\"]\ntype X = { [string] : c }\n\n// Options: [\"never\"]\ntype X = { [string]:c }\n\n// Options: [\"always\"]\ntype X = { +[a : b] : c }\n\n// Options: [\"never\"]\ntype X = { +[a:b]:c }\n\n// Options: [\"always\"]\ntype X = { [a : (b)] : (c) }\n\n// Options: [\"never\"]\ntype X = { [a:(b)]:(c) }\n\n// Options: [\"never\"]\nconst x = ({}:{})\n\n// Options: [\"always\"]\nconst x = ({} :{})\n\n// Options: [\"never\"]\n((x): string)\n\n// Options: [\"always\"]\n((x) : string)\n\n// Options: [\"always\"]\nconst x :number = 7;\n\n// Options: [\"always\"]\nlet x :number = 42;\n\n// Options: [\"always\"]\nvar x :number = 42;\n```\n\n\n\n<a name=\"spread-exact-type\"></a>\n### `spread-exact-type`\n\nEnforce object types, that are spread to be exact type explicitly.\n\nThe following patterns are considered problems:\n\n```js\ntype bar = {...{test: string}}\n// Message: Use $Exact to make type spreading safe.\n\ntype foo = {test: number}; type bar = {...foo}\n// Message: Use $Exact to make type spreading safe.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype bar = {...$Exact<{test: string}>}\n\ntype foo = {test: number}; type bar = {...$Exact<foo>}\n```\n\n\n\n<a name=\"type-id-match\"></a>\n### `type-id-match`\n\nEnforces a consistent naming pattern for type aliases.\n\n<a name=\"options\"></a>\n#### Options\n\nThis rule requires a text RegExp:\n\n```js\n{\n    \"rules\": {\n        \"ft-flow/type-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\nopaque type foo = {};\n// Message: Type identifier 'foo' does not match pattern '/^([A-Z][a-z0-9]*)+Type$/u'.\n\ntype foo = {};\n// Message: Type identifier 'foo' does not match pattern '/^([A-Z][a-z0-9]*)+Type$/u'.\n\n// Options: [\"^foo$\"]\ntype FooType = {};\n// Message: Type identifier 'FooType' does not match pattern '/^foo$/u'.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype FooType = {};\n\n// Options: [\"^foo$\"]\ntype foo = {};\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ntype foo = {};\n```\n\n\n\n<a name=\"type-import-style\"></a>\n### `type-import-style`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces a particular style for type imports:\n\n```\n// 'identifier' style\nimport {type T, type U, type V} from '...';\n\n// 'declaration' style\nimport type {T, U, V} from '...';\n```\n\n<a name=\"options\"></a>\n#### Options\n\nThe rule has a string option:\n\n* `\"identifier\"` (default): Enforces that type imports are all in the\n  'identifier' style.\n* `\"declaration\"`: Enforces that type imports are all in the 'declaration'\n  style.\n\nThis rule has an object option:\n\n* `ignoreTypeDefault` - if `true`, when in \"identifier\" mode, default type imports will be ignored. Default is `false`.\n\nThe following patterns are considered problems:\n\n```js\nimport type {A, B} from 'a';\n// Message: Unexpected \"import type\"\n\n// Options: [\"identifier\"]\nimport type {A, B} from 'a';\n// Message: Unexpected \"import type\"\n\n// Options: [\"identifier\"]\nimport type {A, B as C} from 'a';\n// Message: Unexpected \"import type\"\n\n// Options: [\"identifier\"]\nimport type A from 'a';\n// Message: Unexpected \"import type\"\n\n// Options: [\"declaration\"]\nimport {type A, type B} from 'a';\n// Message: Unexpected type import\n// Message: Unexpected type import\n```\n\nThe following patterns are not considered problems:\n\n```js\nimport {type A, type B} from 'a';\n\n// Options: [\"identifier\"]\nimport {type A, type B} from 'a';\n\n// Options: [\"declaration\"]\nimport type {A, B} from 'a';\n\n// Options: [\"identifier\"]\nimport typeof * as A from 'a';\n\n// Options: [\"identifier\",{\"ignoreTypeDefault\":true}]\nimport type A from 'a';\n\n// Options: [\"identifier\"]\ndeclare module \"m\" { import type A from 'a'; }\n```\n\n\n\n<a name=\"union-intersection-spacing\"></a>\n### `union-intersection-spacing`\n\n_The `--fix` option on the command line automatically fixes problems reported by this rule._\n\nEnforces consistent spacing around union and intersection type separators (`|` and `&`).\n\nThis rule takes one argument. If it is `'always'` then a problem is raised when there is no space around the separator. If it is `'never'` then a problem is raised when there is a space around the separator.\n\nThe default value is `'always'`.\n\nThe following patterns are considered problems:\n\n```js\ntype X = string| number;\n// Message: There must be a space before union type annotation separator\n\n// Options: [\"always\"]\ntype X = string| number;\n// Message: There must be a space before union type annotation separator\n\ntype X = string |number;\n// Message: There must be a space after union type annotation separator\n\ntype X = string|number;\n// Message: There must be a space before union type annotation separator\n// Message: There must be a space after union type annotation separator\n\ntype X = {x: string}|{y: number};\n// Message: There must be a space before union type annotation separator\n// Message: There must be a space after union type annotation separator\n\ntype X = string | number |boolean;\n// Message: There must be a space after union type annotation separator\n\ntype X = string|number|boolean;\n// Message: There must be a space before union type annotation separator\n// Message: There must be a space after union type annotation separator\n// Message: There must be a space before union type annotation separator\n// Message: There must be a space after union type annotation separator\n\ntype X = (string)| number;\n// Message: There must be a space before union type annotation separator\n\ntype X = ((string))|(number | foo);\n// Message: There must be a space before union type annotation separator\n// Message: There must be a space after union type annotation separator\n\n// Options: [\"never\"]\ntype X = string |number;\n// Message: There must be no space before union type annotation separator\n\n// Options: [\"never\"]\ntype X = string| number;\n// Message: There must be no space after union type annotation separator\n\ntype X = string& number;\n// Message: There must be a space before intersection type annotation separator\n\n// Options: [\"always\"]\ntype X = string& number;\n// Message: There must be a space before intersection type annotation separator\n\ntype X = string &number;\n// Message: There must be a space after intersection type annotation separator\n\ntype X = {x: string}&{y: number};\n// Message: There must be a space before intersection type annotation separator\n// Message: There must be a space after intersection type annotation separator\n\ntype X = string&number;\n// Message: There must be a space before intersection type annotation separator\n// Message: There must be a space after intersection type annotation separator\n\ntype X = string & number &boolean;\n// Message: There must be a space after intersection type annotation separator\n\ntype X = string&number&boolean;\n// Message: There must be a space before intersection type annotation separator\n// Message: There must be a space after intersection type annotation separator\n// Message: There must be a space before intersection type annotation separator\n// Message: There must be a space after intersection type annotation separator\n\ntype X = (string)& number;\n// Message: There must be a space before intersection type annotation separator\n\ntype X = ((string))&(number & foo);\n// Message: There must be a space before intersection type annotation separator\n// Message: There must be a space after intersection type annotation separator\n\n// Options: [\"never\"]\ntype X = string &number;\n// Message: There must be no space before intersection type annotation separator\n\n// Options: [\"never\"]\ntype X = string& number;\n// Message: There must be no space after intersection type annotation separator\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype X = string | number;\n\ntype X = string | number | boolean;\n\ntype X = (string) | number;\n\ntype X = ((string)) | (number | foo);\n\n// Options: [\"never\"]\ntype X = string|number\n\ntype X =\n| string\n| number\n\nfunction x() {\ntype X =\n| string\n| number\n}\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ntype X = string| number;\n\ntype X = string & number;\n\ntype X = string & number & boolean;\n\ntype X = (string) & number;\n\ntype X = ((string)) & (number & foo);\n\n// Options: [\"never\"]\ntype X = string&number\n\ntype X =\n& string\n& number\n\nfunction x() {\ntype X =\n& string\n& number\n}\n\n// Settings: {\"ft-flow\":{\"onlyFilesWithFlowAnnotation\":true}}\ntype X = string& number;\n```\n\n\n\n<a name=\"use-flow-type\"></a>\n### `use-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 alias](https://flowtype.org/docs/type-aliases.html) declarations as used.\n\nUsed to suppress [`no-unused-vars`](http://eslint.org/docs/rules/no-unused-vars) errors that are triggered by type aliases.\n\nThe following patterns are not considered problems:\n\n```js\ndeclare class A {}\n// Additional rules: {\"no-unused-vars\":1}\n\ndeclare function A(): Y\n// Additional rules: {\"no-unused-vars\":1}\n\ndeclare module A {}\n// Additional rules: {\"no-unused-vars\":1}\n\ndeclare module A { declare var a: Y }\n// Additional rules: {\"no-unused-vars\":1}\n\ndeclare var A: Y\n// Additional rules: {\"no-unused-vars\":1}\n\nimport type A from \"a\"; type X<B = ComponentType<A>> = { b: B }; let x: X; console.log(x);\n// Additional rules: {\"no-unused-vars\":1}\n\nimport type A from \"a\"; type X<B = A<string>> = { b: B }; let x: X; console.log(x);\n// Additional rules: {\"no-unused-vars\":1}\n```\n\n\n\n<a name=\"use-read-only-spread\"></a>\n### `use-read-only-spread`\n\nWarns against accidentally creating an object which is no longer read-only because of how spread operator works in Flow. Imagine the following code:\n\n```flow js\ntype INode = {|\n  +type: string,\n|};\n\ntype Identifier = {|\n  ...INode,\n  +name: string,\n|};\n```\n\nYou might expect the identifier name to be read-only, however, that's not true ([flow.org/try](https://flow.org/try/#0C4TwDgpgBAkgcgewCbQLxQN4B8BQUoDUokAXFAM7ABOAlgHYDmANDlgL4DcOOx0MKdYDQBmNCFSjpseKADp58ZBBb4CdAIYBbCGUq1GLdlxwBjBHUpQAHmX4RBIsRKlQN2sgHIPTKL08eoTm4rWV5JKA8AZQALBABXABskVwRgKAAjaAB3WmB1dISIAEIPLhC3NAiY+KSUtMyoHJo8guLSnCA)):\n\n```flow js\nconst x: Identifier = { name: '', type: '' };\n\nx.type = 'must NOT be writable!'; // No Flow error\nx.name = 'must NOT be writable!'; // No Flow error\n```\n\nThis rule suggests to use `$ReadOnly<…>` to prevent accidental loss of readonly-ness:\n\n```flow js\ntype Identifier = $ReadOnly<{|\n  ...INode,\n  +name: string,\n|}>;\n\nconst x: Identifier = { name: '', type: '' };\n\nx.type = 'must NOT be writable!'; // $FlowExpectedError[cannot-write]\nx.name = 'must NOT be writable!'; // $FlowExpectedError[cannot-write]\n```\n\nThe following patterns are considered problems:\n\n```js\ntype INode = {||};\ntype Identifier = {|\n  ...INode,\n  +aaa: string,\n|};\n// Message: Flow type with spread property and all readonly properties must be wrapped in '$ReadOnly<…>' to prevent accidental loss of readonly-ness.\n\ntype INode = {||};\ntype Identifier = {|\n  ...INode,\n  +aaa: string,\n  +bbb: string,\n|};\n// Message: Flow type with spread property and all readonly properties must be wrapped in '$ReadOnly<…>' to prevent accidental loss of readonly-ness.\n```\n\nThe following patterns are not considered problems:\n\n```js\ntype INode = {||};\ntype Identifier = {|\n  ...INode,\n  name: string,\n|};\n\ntype INode = {||};\ntype Identifier = {|\n  ...INode,\n  name: string, // writable on purpose\n  +surname: string,\n|};\n\ntype Identifier = {|\n  +name: string,\n|};\n\ntype INode = {||};\ntype Identifier = $ReadOnly<{|\n  ...INode,\n  +name: string,\n|}>;\n\ntype INode = {||};\ntype Identifier = $ReadOnly<{|\n  ...INode,\n  name: string, // writable on purpose\n|}>;\n\ntype INode = {||};\ntype Identifier = $ReadOnly<{|\n  ...INode,\n  -name: string,\n|}>;\n```\n\n\n\n<a name=\"valid-syntax\"></a>\n### `valid-syntax`\n\n**Deprecated** Babylon (the Babel parser) v6.10.0 fixes parsing of the invalid syntax this plugin warned against.\n\nChecks for simple Flow syntax errors.\n\nThe following patterns are not considered problems:\n\n```js\nfunction x(foo: string = \"1\") {}\n\nfunction x(foo: Type = bar()) {}\n```","users":{}}