Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 41 additions & 102 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,50 +1,43 @@
import expensify from 'eslint-config-expensify';
import tsPlugin from '@typescript-eslint/eslint-plugin';
import tsParser from '@typescript-eslint/parser';
import browserConfig from 'eslint-config-expensify/browser';
import reactConfig from 'eslint-config-expensify/react';
import scriptsConfig from 'eslint-config-expensify/scripts';
import tsExpensifyConfig from 'eslint-config-expensify/typescript';
import jestConfig from 'eslint-config-expensify/jest';
import prettierConfig from 'eslint-config-prettier';
import seatbelt from 'eslint-seatbelt';
import rulesdir from 'eslint-plugin-rulesdir';
import {defineConfig, globalIgnores} from 'eslint/config';
import globals from 'globals';
import path from 'node:path';
import {createRequire} from 'node:module';
import {fileURLToPath} from 'node:url';

export default [
...expensify,
prettierConfig,
{
ignores: ['dist/**', 'node_modules/**', '.github/**', '*.d.ts', '*.config.js', '*.config.cjs', 'tests/types/**/*.ts'],
},
const dirname = path.dirname(fileURLToPath(import.meta.url));
const require = createRequire(import.meta.url);
const expensifyConfigDirectory = path.dirname(require.resolve('eslint-config-expensify'));
rulesdir.RULES_DIR = path.resolve(expensifyConfigDirectory, 'eslint-plugin-expensify');

export default defineConfig([
seatbelt.configs.enable,
globalIgnores(['dist/**', 'node_modules/**', '**/*.d.ts', '**/*.config.js', '**/*.config.cjs', 'tests/types/**/*.ts', 'cpp/**', 'bench-results/**', '.github/**']),
...browserConfig,
...reactConfig,
...tsExpensifyConfig,
...jestConfig,
...scriptsConfig,
{
// Overwriting this for now because web-e will conflict with this
files: ['**/*.js', '**/*.jsx'],
plugins: {
rulesdir,
},
settings: {
'import/resolver': {
node: {
extensions: ['.js', '.website.js', '.desktop.js', '.native.js', '.ios.js', '.android.js', '.config.js', '.ts', '.tsx'],
},
seatbelt: {
seatbeltFile: path.join(dirname, 'eslint.seatbelt.tsv'),
threadsafe: true,
},
},
rules: {
'react/jsx-filename-extension': [1, {extensions: ['.js']}],
'rulesdir/no-multiple-onyx-in-file': 'off',
'import/extensions': [
'error',
'ignorePackages',
{
js: 'never',
jsx: 'never',
ts: 'never',
tsx: 'never',
},
],
},
},
{
files: ['**/*.ts', '**/*.tsx'],
plugins: {
'@typescript-eslint': tsPlugin,
},
languageOptions: {
parser: tsParser,
parserOptions: {
project: './tsconfig.json',
},
},
files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],
settings: {
'import/resolver': {
typescript: {
Expand All @@ -54,74 +47,19 @@ export default [
},
},
rules: {
...tsPlugin.configs.recommended.rules,
...tsPlugin.configs.stylistic.rules,
'rulesdir/prefer-underscore-method': 'off',
'react/jsx-props-no-spreading': 'off',
'react/prop-types': 'off',
'react/require-default-props': 'off',
'react/jsx-filename-extension': ['error', {extensions: ['.tsx', '.jsx']}],
'import/no-unresolved': 'error',
'import/consistent-type-specifier-style': ['error', 'prefer-top-level'],
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/no-unused-vars': ['error', {argsIgnorePattern: '^_', caughtErrors: 'none'}],
'@typescript-eslint/consistent-type-imports': ['error', {prefer: 'type-imports'}],
'@typescript-eslint/consistent-type-exports': ['error', {fixMixedExportsWithInlineTypeSpecifier: false}],
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/array-type': ['error', {default: 'array-simple'}],
'@typescript-eslint/consistent-type-definitions': 'off',
'@typescript-eslint/no-empty-object-type': 'off',
'react/jsx-props-no-spreading': 'off',

// Onyx is this package; multiple instances are intentional in tests and mocks.
'rulesdir/no-multiple-onyx-in-file': 'off',
'valid-jsdoc': 'off',
'rulesdir/prefer-import-module-contents': 'off',
'es/no-optional-chaining': 'off',
'es/no-nullish-coalescing-operators': 'off',
// Disable JSDoc type rules for TypeScript files (TypeScript provides the types)
'jsdoc/require-param': 'off',
'jsdoc/require-param-type': 'off',
'jsdoc/check-param-names': 'off',
'jsdoc/check-tag-names': 'off',
'jsdoc/check-types': 'off',
'no-func-assign': 'off',
'no-loop-func': 'off',
'no-redeclare': 'off',
'@typescript-eslint/no-redeclare': 'error',
'import/extensions': [
'error',
'ignorePackages',
{
js: 'never',
jsx: 'never',
ts: 'never',
tsx: 'never',
},
],
'rulesdir/prefer-onyx-connect-in-libs': 'off',
},
},
{
files: ['tests/**/*.{js,jsx,ts,tsx}', 'jestSetup.js', 'lib/**/__mocks__/**/*.{js,ts}'],
languageOptions: {
globals: {
jest: 'readonly',
describe: 'readonly',
it: 'readonly',
test: 'readonly',
expect: 'readonly',
beforeEach: 'readonly',
afterEach: 'readonly',
beforeAll: 'readonly',
afterAll: 'readonly',
fail: 'readonly',
},
},
files: ['tests/**/*', 'jestSetup.js', 'lib/**/__mocks__/**/*'],
rules: {
'@lwc/lwc/no-async-await': 'off',
'no-await-in-loop': 'off',
'no-restricted-syntax': ['error', 'ForInStatement', 'LabeledStatement', 'WithStatement'],
'import/extensions': 'off',
'@typescript-eslint/no-require-imports': 'off',
'no-restricted-imports': 'off',
'no-restricted-syntax': ['error', 'ForInStatement', 'LabeledStatement', 'WithStatement'],
},
},
{
Expand All @@ -134,8 +72,9 @@ export default [
files: ['lib/storage/providers/MemoryOnlyProvider.ts'],
languageOptions: {
globals: {
jest: 'readonly',
...globals.jest,
},
},
},
];
prettierConfig,
]);
167 changes: 167 additions & 0 deletions eslint.seatbelt.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
# eslint-seatbelt temporarily allowed errors
# docs: https://github.com/justjake/eslint-seatbelt#readme

".prettierrc.cjs" "no-undef" 1
"buildDocs.ts" "import/no-extraneous-dependencies" 1
"jest-sequencer.js" "no-undef" 2
"jest-test-environment.ts" "import/no-extraneous-dependencies" 1
"jestSetup.js" "no-undef" 2
"lib/DevTools/RealDevTools.ts" "@typescript-eslint/no-unsafe-assignment" 1
"lib/DevTools/RealDevTools.ts" "@typescript-eslint/no-unsafe-member-access" 1
"lib/DevTools/RealDevTools.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
"lib/Onyx.ts" "@typescript-eslint/no-loop-func" 1
"lib/Onyx.ts" "@typescript-eslint/no-redundant-type-constituents" 2
"lib/Onyx.ts" "@typescript-eslint/no-unnecessary-type-assertion" 3
"lib/Onyx.ts" "@typescript-eslint/no-unsafe-type-assertion" 6
"lib/Onyx.ts" "@typescript-eslint/restrict-template-expressions" 1
"lib/Onyx.ts" "rulesdir/prefer-at" 2
"lib/OnyxCache.ts" "@typescript-eslint/no-redundant-type-constituents" 2
"lib/OnyxCache.ts" "import/no-extraneous-dependencies" 1
"lib/OnyxConnectionManager.ts" "@typescript-eslint/no-unsafe-type-assertion" 8
"lib/OnyxConnectionManager.ts" "@typescript-eslint/non-nullable-type-assertion-style" 3
"lib/OnyxConnectionManager.ts" "import/no-extraneous-dependencies" 1
"lib/OnyxKeys.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
"lib/OnyxKeys.ts" "@typescript-eslint/restrict-template-expressions" 1
"lib/OnyxMerge/index.native.ts" "@typescript-eslint/no-redundant-type-constituents" 2
"lib/OnyxMerge/index.native.ts" "@typescript-eslint/no-unsafe-type-assertion" 3
"lib/OnyxMerge/index.ts" "@typescript-eslint/no-redundant-type-constituents" 2
"lib/OnyxMerge/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 2
"lib/OnyxMerge/types.ts" "@typescript-eslint/no-redundant-type-constituents" 2
"lib/OnyxSnapshotCache.ts" "@typescript-eslint/no-non-null-assertion" 2
"lib/OnyxSnapshotCache.ts" "@typescript-eslint/no-unsafe-type-assertion" 2
"lib/OnyxSnapshotCache.ts" "@typescript-eslint/prefer-nullish-coalescing" 2
"lib/OnyxUtils.ts" "@typescript-eslint/no-redundant-type-constituents" 7
"lib/OnyxUtils.ts" "@typescript-eslint/no-unnecessary-type-assertion" 2
"lib/OnyxUtils.ts" "@typescript-eslint/no-unsafe-argument" 6
"lib/OnyxUtils.ts" "@typescript-eslint/no-unsafe-assignment" 6
"lib/OnyxUtils.ts" "@typescript-eslint/no-unsafe-call" 2
"lib/OnyxUtils.ts" "@typescript-eslint/no-unsafe-member-access" 6
"lib/OnyxUtils.ts" "@typescript-eslint/no-unsafe-type-assertion" 35
"lib/OnyxUtils.ts" "@typescript-eslint/no-use-before-define" 28
"lib/OnyxUtils.ts" "@typescript-eslint/non-nullable-type-assertion-style" 2
"lib/OnyxUtils.ts" "@typescript-eslint/prefer-nullish-coalescing" 4
"lib/OnyxUtils.ts" "@typescript-eslint/restrict-template-expressions" 3
"lib/OnyxUtils.ts" "rulesdir/prefer-at" 1
"lib/Str.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
"lib/storage/InstanceSync/index.ts" "import/no-extraneous-dependencies" 1
"lib/storage/InstanceSync/index.web.ts" "jsdoc/no-types" 2
"lib/storage/__mocks__/index.ts" "@typescript-eslint/no-unsafe-argument" 1
"lib/storage/index.ts" "@typescript-eslint/restrict-template-expressions" 1
"lib/storage/providers/IDBKeyValProvider/index.ts" "@typescript-eslint/no-unsafe-return" 1
"lib/storage/providers/IDBKeyValProvider/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 3
"lib/storage/providers/IDBKeyValProvider/index.ts" "rulesdir/prefer-at" 2
"lib/storage/providers/MemoryOnlyProvider.ts" "@typescript-eslint/no-unsafe-type-assertion" 5
"lib/storage/providers/NoopProvider.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
"lib/storage/providers/NoopProvider.ts" "@typescript-eslint/no-unused-vars" 1
"lib/storage/providers/SQLiteProvider.ts" "@typescript-eslint/naming-convention" 3
"lib/storage/providers/SQLiteProvider.ts" "@typescript-eslint/no-unsafe-return" 3
"lib/storage/providers/SQLiteProvider.ts" "@typescript-eslint/no-unsafe-type-assertion" 3
"lib/types.ts" "@typescript-eslint/consistent-type-definitions" 1
"lib/types.ts" "@typescript-eslint/no-empty-object-type" 1
"lib/types.ts" "@typescript-eslint/no-restricted-types" 2
"lib/useLiveRef.ts" "@typescript-eslint/no-deprecated" 1
"lib/useLiveRef.ts" "react-hooks/refs" 1
"lib/useOnyx.ts" "@typescript-eslint/no-deprecated" 1
"lib/useOnyx.ts" "@typescript-eslint/no-unsafe-type-assertion" 4
"lib/utils.ts" "@typescript-eslint/naming-convention" 2
"lib/utils.ts" "@typescript-eslint/no-redundant-type-constituents" 2
"lib/utils.ts" "@typescript-eslint/no-unsafe-type-assertion" 5
"tests/perf-test/Onyx.perf-test.ts" "@typescript-eslint/no-unnecessary-type-assertion" 2
"tests/perf-test/Onyx.perf-test.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
"tests/perf-test/Onyx.perf-test.ts" "@typescript-eslint/restrict-template-expressions" 1
"tests/perf-test/OnyxCache.perf-test.ts" "@typescript-eslint/no-unnecessary-type-assertion" 1
"tests/perf-test/OnyxCache.perf-test.ts" "@typescript-eslint/no-unsafe-assignment" 1
"tests/perf-test/OnyxCache.perf-test.ts" "@typescript-eslint/no-unsafe-member-access" 1
"tests/perf-test/OnyxCache.perf-test.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
"tests/perf-test/OnyxCache.perf-test.ts" "@typescript-eslint/non-nullable-type-assertion-style" 1
"tests/perf-test/OnyxCache.perf-test.ts" "rulesdir/prefer-at" 13
"tests/perf-test/OnyxConnectionManager.perf-test.ts" "@typescript-eslint/dot-notation" 2
"tests/perf-test/OnyxConnectionManager.perf-test.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
"tests/perf-test/OnyxConnectionManager.perf-test.ts" "@typescript-eslint/non-nullable-type-assertion-style" 1
"tests/perf-test/OnyxConnectionManager.perf-test.ts" "rulesdir/prefer-at" 6
"tests/perf-test/OnyxSnapshotCache.perf-test.ts" "@typescript-eslint/no-unsafe-type-assertion" 4
"tests/perf-test/OnyxSnapshotCache.perf-test.ts" "rulesdir/prefer-at" 1
"tests/perf-test/OnyxUtils.perf-test.ts" "@typescript-eslint/no-misused-promises" 1
"tests/perf-test/OnyxUtils.perf-test.ts" "@typescript-eslint/no-unnecessary-type-assertion" 5
"tests/perf-test/OnyxUtils.perf-test.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
"tests/perf-test/useOnyx.perf-test.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2
"tests/perf-test/utils.perf-test.ts" "@typescript-eslint/no-unsafe-call" 1
"tests/perf-test/utils.perf-test.ts" "@typescript-eslint/no-unsafe-member-access" 3
"tests/unit/DevToolsTest.ts" "@typescript-eslint/dot-notation" 8
"tests/unit/DevToolsTest.ts" "@typescript-eslint/no-unnecessary-type-assertion" 1
"tests/unit/DevToolsTest.ts" "@typescript-eslint/no-unsafe-assignment" 2
"tests/unit/DevToolsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 9
"tests/unit/OnyxConnectionManagerTest.ts" "@typescript-eslint/dot-notation" 3
"tests/unit/OnyxConnectionManagerTest.ts" "@typescript-eslint/no-unnecessary-type-assertion" 2
"tests/unit/OnyxConnectionManagerTest.ts" "@typescript-eslint/no-unsafe-return" 1
"tests/unit/OnyxConnectionManagerTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 2
"tests/unit/OnyxConnectionManagerTest.ts" "rulesdir/prefer-at" 1
"tests/unit/OnyxKeysTest.ts" "@typescript-eslint/naming-convention" 16
"tests/unit/OnyxSnapshotCacheTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 7
"tests/unit/collectionHydrationTest.ts" "@typescript-eslint/no-unsafe-argument" 2
"tests/unit/collectionHydrationTest.ts" "@typescript-eslint/no-unsafe-assignment" 6
"tests/unit/collectionHydrationTest.ts" "@typescript-eslint/no-unsafe-member-access" 9
"tests/unit/collectionHydrationTest.ts" "rulesdir/prefer-at" 4
"tests/unit/mocks/sqliteMock.ts" "@typescript-eslint/naming-convention" 1
"tests/unit/mocks/sqliteMock.ts" "@typescript-eslint/no-unsafe-type-assertion" 7
"tests/unit/mocks/sqliteMock.ts" "rulesdir/prefer-at" 2
"tests/unit/onyxCacheTest.tsx" "@typescript-eslint/no-non-null-assertion" 3
"tests/unit/onyxCacheTest.tsx" "@typescript-eslint/no-unsafe-assignment" 7
"tests/unit/onyxCacheTest.tsx" "@typescript-eslint/no-unsafe-member-access" 6
"tests/unit/onyxCacheTest.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2
"tests/unit/onyxClearNativeStorageTest.ts" "@typescript-eslint/no-unsafe-assignment" 1
"tests/unit/onyxClearNativeStorageTest.ts" "@typescript-eslint/no-unsafe-member-access" 1
"tests/unit/onyxClearNativeStorageTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 4
"tests/unit/onyxClearWebStorageTest.ts" "@typescript-eslint/naming-convention" 12
"tests/unit/onyxClearWebStorageTest.ts" "@typescript-eslint/no-unnecessary-type-assertion" 4
"tests/unit/onyxClearWebStorageTest.ts" "@typescript-eslint/no-unsafe-assignment" 1
"tests/unit/onyxClearWebStorageTest.ts" "@typescript-eslint/no-unsafe-member-access" 1
"tests/unit/onyxMultiMergeWebStorageTest.ts" "@typescript-eslint/naming-convention" 16
"tests/unit/onyxMultiMergeWebStorageTest.ts" "@typescript-eslint/no-unnecessary-type-assertion" 5
"tests/unit/onyxMultiMergeWebStorageTest.ts" "@typescript-eslint/no-unsafe-assignment" 1
"tests/unit/onyxMultiMergeWebStorageTest.ts" "@typescript-eslint/no-unsafe-member-access" 1
"tests/unit/onyxMultiMergeWebStorageTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
"tests/unit/onyxTest.ts" "@typescript-eslint/naming-convention" 122
"tests/unit/onyxTest.ts" "@typescript-eslint/no-deprecated" 2
"tests/unit/onyxTest.ts" "@typescript-eslint/no-non-null-assertion" 1
"tests/unit/onyxTest.ts" "@typescript-eslint/no-unnecessary-type-assertion" 27
"tests/unit/onyxTest.ts" "@typescript-eslint/no-unsafe-assignment" 9
"tests/unit/onyxTest.ts" "@typescript-eslint/no-unsafe-call" 2
"tests/unit/onyxTest.ts" "@typescript-eslint/no-unsafe-member-access" 26
"tests/unit/onyxTest.ts" "@typescript-eslint/no-unsafe-return" 3
"tests/unit/onyxTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 5
"tests/unit/onyxTest.ts" "import/no-extraneous-dependencies" 2
"tests/unit/onyxTest.ts" "rulesdir/prefer-at" 4
"tests/unit/onyxUtilsTest.ts" "@typescript-eslint/await-thenable" 6
"tests/unit/onyxUtilsTest.ts" "@typescript-eslint/no-unnecessary-type-assertion" 21
"tests/unit/onyxUtilsTest.ts" "@typescript-eslint/no-unsafe-assignment" 10
"tests/unit/onyxUtilsTest.ts" "@typescript-eslint/no-unsafe-call" 2
"tests/unit/onyxUtilsTest.ts" "@typescript-eslint/no-unsafe-member-access" 20
"tests/unit/onyxUtilsTest.ts" "@typescript-eslint/no-unsafe-return" 1
"tests/unit/onyxUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 3
"tests/unit/onyxUtilsTest.ts" "rulesdir/prefer-at" 4
"tests/unit/storage/providers/IDBKeyvalProviderTest.ts" "@typescript-eslint/no-unnecessary-type-assertion" 2
"tests/unit/storage/providers/IDBKeyvalProviderTest.ts" "@typescript-eslint/no-unsafe-member-access" 2
"tests/unit/storage/providers/IDBKeyvalProviderTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 4
"tests/unit/storage/providers/IDBKeyvalProviderTest.ts" "@typescript-eslint/unbound-method" 2
"tests/unit/storage/providers/IDBKeyvalProviderTest.ts" "rulesdir/prefer-at" 7
"tests/unit/storage/providers/SQLiteProviderTest.ts" "@typescript-eslint/no-unnecessary-type-assertion" 7
"tests/unit/storage/providers/SQLiteProviderTest.ts" "@typescript-eslint/no-unsafe-member-access" 2
"tests/unit/storage/providers/SQLiteProviderTest.ts" "@typescript-eslint/no-unsafe-return" 1
"tests/unit/storage/providers/SQLiteProviderTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 5
"tests/unit/storage/providers/SQLiteProviderTest.ts" "rulesdir/prefer-at" 4
"tests/unit/storage/providers/createStoreTest.ts" "@typescript-eslint/no-non-null-assertion" 1
"tests/unit/storage/providers/createStoreTest.ts" "@typescript-eslint/no-unnecessary-type-assertion" 5
"tests/unit/storage/providers/createStoreTest.ts" "@typescript-eslint/no-unsafe-assignment" 18
"tests/unit/storage/providers/createStoreTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 10
"tests/unit/storage/providers/createStoreTest.ts" "@typescript-eslint/unbound-method" 10
"tests/unit/storage/tryOrDegradePerformanceTest.ts" "@typescript-eslint/no-unsafe-assignment" 2
"tests/unit/storage/tryOrDegradePerformanceTest.ts" "@typescript-eslint/no-unsafe-member-access" 1
"tests/unit/useOnyxTest.ts" "@typescript-eslint/no-unnecessary-type-assertion" 21
"tests/unit/useOnyxTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 21
"tests/unit/useOnyxTest.ts" "@typescript-eslint/prefer-nullish-coalescing" 1
"tests/unit/useOnyxTest.ts" "rulesdir/prefer-at" 1
"tests/unit/utilsTest.ts" "@typescript-eslint/no-unsafe-member-access" 3
"tests/unit/utilsTest.ts" "rulesdir/prefer-at" 2
"tests/utils/alternateLists.ts" "rulesdir/prefer-at" 2
"tests/utils/collections/reportActions.ts" "@typescript-eslint/restrict-template-expressions" 1
1 change: 0 additions & 1 deletion lib/Logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ type LogData = {
};
type LoggerCallback = (data: LogData) => void;

// eslint-disable-next-line @typescript-eslint/no-empty-function
let logger: LoggerCallback = () => {};

/**
Expand Down
Loading
Loading