From 4c83fbb52405d508c7642573729564c1a009f1c1 Mon Sep 17 00:00:00 2001 From: Anton Kastritskiy Date: Fri, 28 Jan 2022 05:42:04 -0800 Subject: [PATCH] warn about ts file extension Summary: remove statically analysable life from typescript guidelines and let eslint handle it Reviewed By: passy Differential Revision: D33819891 fbshipit-source-id: 3cc3cb512607c3651cd3a9e48228d83bab5bb64a --- desktop/.eslintrc.js | 1 + desktop/eslint-plugin-flipper/src/index.ts | 4 ++ .../src/rules/noTsFileExtension.ts | 48 +++++++++++++++++++ docs/extending/dev-setup.mdx | 1 - 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 desktop/eslint-plugin-flipper/src/rules/noTsFileExtension.ts diff --git a/desktop/.eslintrc.js b/desktop/.eslintrc.js index 365fb3699..065b4e82c 100644 --- a/desktop/.eslintrc.js +++ b/desktop/.eslintrc.js @@ -144,6 +144,7 @@ module.exports = { 'flipper/no-relative-imports-across-packages': [2], 'flipper/no-electron-remote-imports': [1], 'flipper/no-console-error-without-context': [2], + 'flipper/no-ts-file-extension': 1, 'communist-spelling/communist-spelling': [1, {allow: ['cancelled']}], // promise rules, see https://github.com/xjamundx/eslint-plugin-promise for details on each of them diff --git a/desktop/eslint-plugin-flipper/src/index.ts b/desktop/eslint-plugin-flipper/src/index.ts index a17340a01..20db3646b 100644 --- a/desktop/eslint-plugin-flipper/src/index.ts +++ b/desktop/eslint-plugin-flipper/src/index.ts @@ -16,11 +16,15 @@ import noElectronRemoteImports, { import noConsoleErrorWithoutContext, { RULE_NAME as noConsoleErrorWithoutContextRuleName, } from './rules/noConsoleErrorWithoutContext'; +import noTsFileExtension, { + RULE_NAME as noTsFileExtensionRuleName, +} from './rules/noTsFileExtension'; module.exports = { rules: { [noRelativeImportsAcrossPackagesRuleName]: noRelativeImportsAcrossPackages, [noElectronRemoteImportsRuleName]: noElectronRemoteImports, [noConsoleErrorWithoutContextRuleName]: noConsoleErrorWithoutContext, + [noTsFileExtensionRuleName]: noTsFileExtension, }, }; diff --git a/desktop/eslint-plugin-flipper/src/rules/noTsFileExtension.ts b/desktop/eslint-plugin-flipper/src/rules/noTsFileExtension.ts new file mode 100644 index 000000000..64a73e193 --- /dev/null +++ b/desktop/eslint-plugin-flipper/src/rules/noTsFileExtension.ts @@ -0,0 +1,48 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import path from 'path'; +import {createESLintRule} from '../utils/createEslintRule'; + +type Options = []; + +export type MessageIds = 'noTsFileExtension'; +export const RULE_NAME = 'no-ts-file-extension'; + +export default createESLintRule({ + name: RULE_NAME, + meta: { + type: 'problem', + docs: { + description: 'Prefer "tsx" file extensions', + recommended: 'error', + }, + schema: [], + messages: { + noTsFileExtension: 'Use "tsx" file extension instead of "ts"', + }, + }, + defaultOptions: [], + create(context) { + const filename = context.getFilename(); + const ext = path.extname(filename); + const isTs = ext === '.ts' && !filename.endsWith('.d.ts'); + + return { + Program(node) { + if (isTs) { + context.report({ + node: node, + messageId: 'noTsFileExtension', + }); + } + }, + }; + }, +}); diff --git a/docs/extending/dev-setup.mdx b/docs/extending/dev-setup.mdx index 8b069b8f1..1ddb378b3 100644 --- a/docs/extending/dev-setup.mdx +++ b/docs/extending/dev-setup.mdx @@ -158,7 +158,6 @@ To start Flipper against a specific OnDemand instance, set FB_ONDEMAND flag, e.g ## Guidelines for writing TypeScript -* **Important:** Use `.tsx` file extension for all TypeScript files (instead of `.ts`) * Prefer `type` for React props and state over interfaces * Don’t prefix interfaces with `I` * Enums, Types and Interfaces use PascalCase (uppercase first letter)