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
This commit is contained in:
Anton Kastritskiy
2022-01-28 05:42:04 -08:00
committed by Facebook GitHub Bot
parent e9da574720
commit 4c83fbb524
4 changed files with 53 additions and 1 deletions

View File

@@ -144,6 +144,7 @@ module.exports = {
'flipper/no-relative-imports-across-packages': [2], 'flipper/no-relative-imports-across-packages': [2],
'flipper/no-electron-remote-imports': [1], 'flipper/no-electron-remote-imports': [1],
'flipper/no-console-error-without-context': [2], 'flipper/no-console-error-without-context': [2],
'flipper/no-ts-file-extension': 1,
'communist-spelling/communist-spelling': [1, {allow: ['cancelled']}], 'communist-spelling/communist-spelling': [1, {allow: ['cancelled']}],
// promise rules, see https://github.com/xjamundx/eslint-plugin-promise for details on each of them // promise rules, see https://github.com/xjamundx/eslint-plugin-promise for details on each of them

View File

@@ -16,11 +16,15 @@ import noElectronRemoteImports, {
import noConsoleErrorWithoutContext, { import noConsoleErrorWithoutContext, {
RULE_NAME as noConsoleErrorWithoutContextRuleName, RULE_NAME as noConsoleErrorWithoutContextRuleName,
} from './rules/noConsoleErrorWithoutContext'; } from './rules/noConsoleErrorWithoutContext';
import noTsFileExtension, {
RULE_NAME as noTsFileExtensionRuleName,
} from './rules/noTsFileExtension';
module.exports = { module.exports = {
rules: { rules: {
[noRelativeImportsAcrossPackagesRuleName]: noRelativeImportsAcrossPackages, [noRelativeImportsAcrossPackagesRuleName]: noRelativeImportsAcrossPackages,
[noElectronRemoteImportsRuleName]: noElectronRemoteImports, [noElectronRemoteImportsRuleName]: noElectronRemoteImports,
[noConsoleErrorWithoutContextRuleName]: noConsoleErrorWithoutContext, [noConsoleErrorWithoutContextRuleName]: noConsoleErrorWithoutContext,
[noTsFileExtensionRuleName]: noTsFileExtension,
}, },
}; };

View File

@@ -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<Options, MessageIds>({
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',
});
}
},
};
},
});

View File

@@ -158,7 +158,6 @@ To start Flipper against a specific OnDemand instance, set FB_ONDEMAND flag, e.g
</FbInternalOnly> </FbInternalOnly>
## Guidelines for writing TypeScript ## 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 * Prefer `type` for React props and state over interfaces
* Dont prefix interfaces with `I` * Dont prefix interfaces with `I`
* Enums, Types and Interfaces use PascalCase (uppercase first letter) * Enums, Types and Interfaces use PascalCase (uppercase first letter)