diff --git a/eslint.changed.config.mjs b/eslint.changed.config.mjs new file mode 100644 index 000000000000..882c33faea73 --- /dev/null +++ b/eslint.changed.config.mjs @@ -0,0 +1,46 @@ +import {defineConfig} from 'eslint/config'; +import mainConfig from './eslint.config.mjs'; + +const config = defineConfig([ + ...mainConfig, + + { + files: ['**/*.ts', '**/*.tsx'], + rules: { + '@typescript-eslint/no-deprecated': 'error', + 'rulesdir/no-default-id-values': 'error', + 'rulesdir/provide-canBeMissing-in-useOnyx': 'error', + 'rulesdir/no-unstable-hook-defaults': 'error', + 'no-restricted-syntax': [ + 'error', + { + selector: 'ImportNamespaceSpecifier[parent.source.value=/^@libs/]', + message: 'Namespace imports from @libs are not allowed. Use named imports instead. Example: import { method } from "@libs/module"', + }, + { + selector: 'ImportNamespaceSpecifier[parent.source.value=/^@userActions/]', + message: 'Namespace imports from @userActions are not allowed. Use named imports instead. Example: import { action } from "@userActions/module"', + }, + ], + }, + }, + + { + files: ['**/libs/**/*.{ts,tsx}'], + rules: { + 'no-restricted-syntax': [ + 'error', + { + selector: 'ImportNamespaceSpecifier[parent.source.value=/^\\.\\./]', + message: 'Namespace imports are not allowed. Use named imports instead. Example: import { method } from "../libs/module"', + }, + { + selector: 'ImportNamespaceSpecifier[parent.source.value=/^\\./]', + message: 'Namespace imports are not allowed. Use named imports instead. Example: import { method } from "./libs/module"', + }, + ], + }, + }, +]); + +export default config; diff --git a/eslint.config.changed.js b/eslint.config.changed.js deleted file mode 100644 index 62c6ea1ef2cb..000000000000 --- a/eslint.config.changed.js +++ /dev/null @@ -1,106 +0,0 @@ -import {FlatCompat} from '@eslint/eslintrc'; -import tsParser from '@typescript-eslint/parser'; -import expensifyConfig from 'eslint-config-expensify'; -import lodash from 'eslint-plugin-lodash'; -import reactCompiler from 'eslint-plugin-react-compiler'; -import reactNativeA11Y from 'eslint-plugin-react-native-a11y'; -import testingLibrary from 'eslint-plugin-testing-library'; -import youDontNeedLodashUnderscore from 'eslint-plugin-you-dont-need-lodash-underscore'; -import {defineConfig, globalIgnores} from 'eslint/config'; -import path from 'node:path'; -import {fileURLToPath} from 'node:url'; -import typescriptEslint from 'typescript-eslint'; - -const filename = fileURLToPath(import.meta.url); -const dirname = path.dirname(filename); - -const config = defineConfig([ - { - extends: new FlatCompat({baseDirectory: dirname}).extends('plugin:@dword-design/import-alias/recommended'), - - plugins: Object.assign( - { - '@typescript-eslint': typescriptEslint.plugin, - 'you-dont-need-lodash-underscore': youDontNeedLodashUnderscore, - 'react-native-a11y': reactNativeA11Y, - 'testing-library': testingLibrary, - 'react-compiler': reactCompiler, - lodash, - }, - ...expensifyConfig.map((item) => item.plugins), - ), - - languageOptions: { - parser: tsParser, - parserOptions: { - project: path.resolve(dirname, './tsconfig.json'), - }, - }, - - linterOptions: { - reportUnusedDisableDirectives: 'off', - }, - - files: ['**/*.ts', '**/*.tsx'], - rules: { - '@dword-design/import-alias/prefer-alias': 'off', - '@typescript-eslint/no-deprecated': 'error', - 'rulesdir/no-default-id-values': 'error', - 'rulesdir/provide-canBeMissing-in-useOnyx': 'error', - 'rulesdir/no-unstable-hook-defaults': 'error', - 'no-restricted-syntax': [ - 'error', - { - selector: 'ImportNamespaceSpecifier[parent.source.value=/^@libs/]', - message: 'Namespace imports from @libs are not allowed. Use named imports instead. Example: import { method } from "@libs/module"', - }, - { - selector: 'ImportNamespaceSpecifier[parent.source.value=/^@userActions/]', - message: 'Namespace imports from @userActions are not allowed. Use named imports instead. Example: import { action } from "@userActions/module"', - }, - ], - }, - }, - - { - files: ['**/libs/**/*.{ts,tsx}'], - rules: { - 'no-restricted-syntax': [ - 'error', - { - selector: 'ImportNamespaceSpecifier[parent.source.value=/^\\.\\./]', - message: 'Namespace imports are not allowed. Use named imports instead. Example: import { method } from "../libs/module"', - }, - { - selector: 'ImportNamespaceSpecifier[parent.source.value=/^\\./]', - message: 'Namespace imports are not allowed. Use named imports instead. Example: import { method } from "./libs/module"', - }, - ], - }, - }, - - globalIgnores([ - '!**/.storybook', - '!**/.github', - '.github/actions/**/index.js', - '**/*.config.js', - '**/*.config.mjs', - '**/node_modules/**/*', - '**/dist/**/*', - 'android/**/build/**/*', - 'docs/vendor/**/*', - 'docs/assets/**/*', - 'web/gtm.js', - '**/.expo/**/*', - 'src/libs/SearchParser/searchParser.js', - 'src/libs/SearchParser/autocompleteParser.js', - 'help/_scripts/**/*', - 'modules/ExpensifyNitroUtils/nitrogen/**/*', - 'Mobile-Expensify/**/*', - '**/vendor', - 'modules/group-ib-fp/**/*', - 'web/snippets/gib.js', - ]), -]); - -export default config; diff --git a/eslint.config.js b/eslint.config.mjs similarity index 99% rename from eslint.config.js rename to eslint.config.mjs index 1d021ecf75c9..82c7b7ee4857 100644 --- a/eslint.config.js +++ b/eslint.config.mjs @@ -269,7 +269,6 @@ const config = defineConfig([ // Rulesdir specific rules 'rulesdir/no-default-props': 'error', 'rulesdir/prefer-type-fest': 'error', - 'rulesdir/no-multiple-onyx-in-file': 'off', 'rulesdir/prefer-underscore-method': 'off', 'rulesdir/prefer-import-module-contents': 'off', 'rulesdir/no-beta-handler': 'error', @@ -571,6 +570,7 @@ const config = defineConfig([ 'docs/assets/**/*', 'web/gtm.js', '**/.expo/**/*', + '**/.rock/**/*', 'src/libs/SearchParser/searchParser.js', 'src/libs/SearchParser/autocompleteParser.js', 'help/_scripts/**/*', diff --git a/scripts/combine-web-sourcemaps.ts b/scripts/combine-web-sourcemaps.ts index 4a5972ed79c5..f35c5e56181d 100755 --- a/scripts/combine-web-sourcemaps.ts +++ b/scripts/combine-web-sourcemaps.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/await-thenable */ import fs from 'fs'; import path from 'path'; import type {RawSourceMap} from 'source-map'; diff --git a/scripts/lintChanged.sh b/scripts/lintChanged.sh index a07241162f45..56f33828b420 100755 --- a/scripts/lintChanged.sh +++ b/scripts/lintChanged.sh @@ -36,7 +36,7 @@ fi # Run eslint on the changed files if [[ -n "$GIT_DIFF_OUTPUT" ]] ; then # shellcheck disable=SC2086 # For multiple files in variable - eslint --max-warnings=0 --config ./eslint.config.changed.js $GIT_DIFF_OUTPUT + eslint --max-warnings=241 --config ./eslint.changed.config.mjs $GIT_DIFF_OUTPUT else info "No TypeScript files changed" fi diff --git a/src/components/ProductTrainingContext/TOOLTIPS.ts b/src/components/ProductTrainingContext/TOOLTIPS.ts index 0f4624473d4c..3e9cfb979e7b 100644 --- a/src/components/ProductTrainingContext/TOOLTIPS.ts +++ b/src/components/ProductTrainingContext/TOOLTIPS.ts @@ -3,20 +3,10 @@ import {dismissProductTraining} from '@libs/actions/Welcome'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; -const { - CONCIERGE_LHN_GBR, - RENAME_SAVED_SEARCH, - SCAN_TEST_TOOLTIP, - SCAN_TEST_TOOLTIP_MANAGER, - SCAN_TEST_CONFIRMATION, - OUTSTANDING_FILTER, - ACCOUNT_SWITCHER, - SCAN_TEST_DRIVE_CONFIRMATION, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - MULTI_SCAN_EDUCATIONAL_MODAL, -} = CONST.PRODUCT_TRAINING_TOOLTIP_NAMES; +const {CONCIERGE_LHN_GBR, RENAME_SAVED_SEARCH, SCAN_TEST_TOOLTIP, SCAN_TEST_TOOLTIP_MANAGER, SCAN_TEST_CONFIRMATION, OUTSTANDING_FILTER, ACCOUNT_SWITCHER, SCAN_TEST_DRIVE_CONFIRMATION} = + CONST.PRODUCT_TRAINING_TOOLTIP_NAMES; -type ProductTrainingTooltipName = Exclude, typeof MULTI_SCAN_EDUCATIONAL_MODAL>; +type ProductTrainingTooltipName = Exclude, typeof CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.MULTI_SCAN_EDUCATIONAL_MODAL>; type ShouldShowConditionProps = { shouldUseNarrowLayout: boolean; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index c3fa75846ef5..977293b2ab0a 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -12048,7 +12048,8 @@ function checkIfScanFileCanBeRead( onFailure: () => void, ) { if (!receiptFilename || !receiptPath) { - return; + onFailure(); + return Promise.resolve(); } return readFileAsync(receiptPath.toString(), receiptFilename, onSuccess, onFailure, receiptType); diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index 3f2f94dea373..e1e17988681d 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -410,7 +410,6 @@ function IOURequestStepConfirmation({ let isScanFilesCanBeRead = true; Promise.all( - // eslint-disable-next-line @typescript-eslint/await-thenable transactions.map((item) => { const itemReceiptFilename = getReceiptFilenameFromTransaction(item); const itemReceiptPath = item.receipt?.source; @@ -421,7 +420,7 @@ function IOURequestStepConfirmation({ if (item.receipt) { newReceiptFiles = {...newReceiptFiles, [item.transactionID]: item.receipt}; } - return; + return Promise.resolve(); } const onSuccess = (file: File) => { diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index 9e78940ac2f4..d61b92953fcb 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -241,13 +241,12 @@ function IOURequestStepScan({ let isAllScanFilesCanBeRead = true; Promise.all( - // eslint-disable-next-line @typescript-eslint/await-thenable transactions.map((item) => { const itemReceiptPath = item.receipt?.source; const isLocalFile = isLocalFileFileUtils(itemReceiptPath); if (!isLocalFile) { - return; + return Promise.resolve(); } const onFailure = () => {