From fd7e385c12fdfaa5fdcd68fcf547f3c9c6c22d12 Mon Sep 17 00:00:00 2001 From: VickyStash Date: Thu, 22 Oct 2026 13:42:16 +0200 Subject: [PATCH 1/9] Add a new lint rule --- config/eslint/eslint.config.mjs | 17 +++ .../no-onyx-loading-status.js | 114 ++++++++++++++++++ tests/unit/NoOnyxLoadingStatusRuleTest.ts | 95 +++++++++++++++ 3 files changed, 226 insertions(+) create mode 100644 eslint-plugin-local-rules/no-onyx-loading-status.js create mode 100644 tests/unit/NoOnyxLoadingStatusRuleTest.ts diff --git a/config/eslint/eslint.config.mjs b/config/eslint/eslint.config.mjs index 1194e9100074..cbda5c227df9 100644 --- a/config/eslint/eslint.config.mjs +++ b/config/eslint/eslint.config.mjs @@ -314,6 +314,7 @@ const config = defineConfig([ 'rulesdir/no-raw-typography': 'error', 'rulesdir/no-layout-spacing-conditional': 'error', 'rulesdir/no-direct-personal-details-list': 'error', + 'rulesdir/no-onyx-loading-status': 'error', 'rulesdir/require-locale-for-localized-date-format': 'error', 'rulesdir/prefer-narrow-hook-dependencies': [ 'error', @@ -693,6 +694,22 @@ const config = defineConfig([ }, }, + // LocaleContextProvider and HybridAppHandler mount before `Onyx.init` finishes, so they keep relying on the startup + // loading status. Tests and mocks follow the code they cover and get cleaned up together with it. + { + files: [ + 'src/components/LocaleContextProvider.tsx', + 'src/HybridAppHandler.tsx', + 'tests/**/*.{ts,tsx}', + 'jest/**/*.{ts,tsx}', + '__mocks__/**/*.{ts,tsx}', + 'src/**/__mocks__/**/*.{ts,tsx}', + ], + rules: { + 'rulesdir/no-onyx-loading-status': 'off', + }, + }, + // The typography token files are where raw font sizes and line heights are defined. { files: ['src/styles/typography.ts', 'src/styles/variables.ts'], diff --git a/eslint-plugin-local-rules/no-onyx-loading-status.js b/eslint-plugin-local-rules/no-onyx-loading-status.js new file mode 100644 index 000000000000..ae7596f99061 --- /dev/null +++ b/eslint-plugin-local-rules/no-onyx-loading-status.js @@ -0,0 +1,114 @@ +const name = 'no-onyx-loading-status'; + +const meta = { + type: 'problem', + docs: { + description: + 'Disallow `isLoadingOnyxValue` and reads of `status` from `useOnyx` results. Onyx is removing per-key loading status, so after `Onyx.init` finishes the status will always be `loaded`.', + recommended: 'error', + }, + schema: [], + messages: { + isLoadingOnyxValueImport: + 'Do not use `isLoadingOnyxValue`. Onyx is removing per-key loading status from `useOnyx`, so after startup this will always return `false`. Read the value directly and treat `undefined` as no data (https://github.com/Expensify/App/issues/104583).', + statusRead: + 'Do not read `status` from a `useOnyx` result. Onyx is removing per-key loading status, so after startup it will always be `loaded`. Read the value directly and treat `undefined` as no data (https://github.com/Expensify/App/issues/104583).', + }, +}; + +const USE_ONYX_IDENTIFIER = 'useOnyx'; +const STATUS_PROPERTY = 'status'; +const IS_LOADING_ONYX_VALUE_PATH_SUFFIX = 'types/utils/isLoadingOnyxValue'; + +/** + * @param {import('estree').MemberExpression | import('estree').Property} node + * @returns {string | undefined} + */ +function getStaticKeyName(node) { + const key = node.type === 'MemberExpression' ? node.property : node.key; + if (!node.computed) { + return key.type === 'Identifier' ? key.name : undefined; + } + if (key.type === 'Literal') { + return typeof key.value === 'string' ? key.value : undefined; + } + if (key.type === 'TemplateLiteral' && key.expressions.length === 0 && key.quasis.length === 1) { + return key.quasis[0].value.cooked; + } + return undefined; +} + +/** + * @param {import('estree').Pattern} pattern + * @returns {import('estree').Property | undefined} + */ +function findStatusProperty(pattern) { + if (pattern.type !== 'ObjectPattern') { + return undefined; + } + return pattern.properties.find((property) => property.type === 'Property' && getStaticKeyName(property) === STATUS_PROPERTY); +} + +/** + * @param {import('eslint').Rule.RuleContext} context + * @returns {import('eslint').Rule.RuleListener} + */ +function create(context) { + /** + * Reports `metadata.status`, `metadata?.status` and `const {status} = metadata` for a variable holding `useOnyx` result metadata. + * + * @param {import('eslint').Scope.Variable} variable + */ + function reportStatusReads(variable) { + for (const reference of variable.references) { + const identifier = reference.identifier; + const parent = identifier.parent; + if (parent.type === 'MemberExpression' && parent.object === identifier && getStaticKeyName(parent) === STATUS_PROPERTY) { + context.report({node: parent, messageId: 'statusRead'}); + continue; + } + if (parent.type === 'VariableDeclarator' && parent.init === identifier) { + const statusProperty = findStatusProperty(parent.id); + if (statusProperty) { + context.report({node: statusProperty, messageId: 'statusRead'}); + } + } + } + } + + return { + ImportDeclaration(node) { + if (node.importKind === 'type' || typeof node.source.value !== 'string' || !node.source.value.endsWith(IS_LOADING_ONYX_VALUE_PATH_SUFFIX)) { + return; + } + context.report({node, messageId: 'isLoadingOnyxValueImport'}); + }, + + VariableDeclarator(node) { + if (node.id.type !== 'ArrayPattern' || node.init?.type !== 'CallExpression') { + return; + } + const callee = node.init.callee; + if (callee.type !== 'Identifier' || callee.name !== USE_ONYX_IDENTIFIER) { + return; + } + const metadataPattern = node.id.elements.at(1); + if (!metadataPattern) { + return; + } + if (metadataPattern.type === 'Identifier') { + const variable = context.sourceCode.getDeclaredVariables(node).find((declaredVariable) => declaredVariable.name === metadataPattern.name); + if (variable) { + reportStatusReads(variable); + } + return; + } + const statusProperty = findStatusProperty(metadataPattern); + if (statusProperty) { + context.report({node: statusProperty, messageId: 'statusRead'}); + } + }, + }; +} + +export {name, meta, create}; diff --git a/tests/unit/NoOnyxLoadingStatusRuleTest.ts b/tests/unit/NoOnyxLoadingStatusRuleTest.ts new file mode 100644 index 000000000000..bb72057292fe --- /dev/null +++ b/tests/unit/NoOnyxLoadingStatusRuleTest.ts @@ -0,0 +1,95 @@ +import type {Rule} from 'eslint'; + +import {RuleTester} from 'eslint'; +import {parser as tsParser} from 'typescript-eslint'; + +type LocalRuleModule = Rule.RuleModule & { + name: string; +}; + +function isLocalRuleModule(ruleModule: unknown): ruleModule is LocalRuleModule { + if (typeof ruleModule !== 'object' || ruleModule === null) { + return false; + } + + const ruleName: unknown = Reflect.get(ruleModule, 'name'); + const create: unknown = Reflect.get(ruleModule, 'create'); + const meta: unknown = Reflect.get(ruleModule, 'meta'); + + return typeof ruleName === 'string' && typeof create === 'function' && typeof meta === 'object' && meta !== null; +} + +const ruleModule: unknown = require('../../eslint-plugin-local-rules/no-onyx-loading-status'); + +if (!isLocalRuleModule(ruleModule)) { + throw new TypeError('Expected no-onyx-loading-status to export an ESLint rule module.'); +} + +const tsRuleTester = new RuleTester({ + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + parser: tsParser, + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, +}); + +describe('no-onyx-loading-status', () => { + tsRuleTester.run(ruleModule.name, ruleModule, { + valid: [ + 'const [session] = useOnyx(ONYXKEYS.SESSION);', + 'const [session, sessionMetadata] = useOnyx(ONYXKEYS.SESSION); doSomething(sessionMetadata);', + 'const [session, {sourceValue}] = useOnyx(ONYXKEYS.SESSION);', + // Not a useOnyx result, e.g. Promise.allSettled results or API responses. + "const results = await Promise.allSettled(promises); const isFulfilled = results[0].status === 'fulfilled';", + "const [first, second] = useSomethingElse(); const isLoaded = second.status === 'loaded';", + 'const response = await fetch(url); const isOk = response.status === 200;', + // A type-only import does not read the status. + "import type isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';", + "import useOnyx from '@hooks/useOnyx';", + ], + invalid: [ + { + code: "import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';", + errors: [{messageId: 'isLoadingOnyxValueImport'}], + }, + { + code: "import isLoadingOnyxValue from './types/utils/isLoadingOnyxValue';", + errors: [{messageId: 'isLoadingOnyxValueImport'}], + }, + { + code: "const [session, sessionMetadata] = useOnyx(ONYXKEYS.SESSION); const isLoading = sessionMetadata.status === 'loading';", + errors: [{messageId: 'statusRead'}], + }, + { + code: "const [, cardFeedsResult] = useOnyx(ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER); const isLoading = cardFeedsResult?.status === 'loading';", + errors: [{messageId: 'statusRead'}], + }, + { + code: "const [session, sessionMetadata] = useOnyx(ONYXKEYS.SESSION); const isLoading = sessionMetadata['status'] === 'loading';", + errors: [{messageId: 'statusRead'}], + }, + { + code: 'const [value, {status}] = useOnyx(onyxKey);', + errors: [{messageId: 'statusRead'}], + }, + { + code: 'const [recentWaypoints, {status: recentWaypointsStatus}] = useOnyx(ONYXKEYS.NVP_RECENT_WAYPOINTS);', + errors: [{messageId: 'statusRead'}], + }, + { + code: 'const [session, sessionMetadata] = useOnyx(ONYXKEYS.SESSION); const {status} = sessionMetadata;', + errors: [{messageId: 'statusRead'}], + }, + { + // Reported per read, so the seatbelt count is per read too. + code: 'const [draft, draftMetadata] = useOnyx(ONYXKEYS.DRAFT); useEffect(() => { if (draftMetadata.status !== "loaded") { return; } }, [draft, draftMetadata.status]);', + errors: [{messageId: 'statusRead'}, {messageId: 'statusRead'}], + }, + ], + }); +}); From 9fdb82d9839249b05b88bf6fd593c5b0a7987cb4 Mon Sep 17 00:00:00 2001 From: VickyStash Date: Thu, 22 Oct 2026 14:58:15 +0200 Subject: [PATCH 2/9] Add seatbelt --- config/eslint/eslint.seatbelt.tsv | 209 ++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) diff --git a/config/eslint/eslint.seatbelt.tsv b/config/eslint/eslint.seatbelt.tsv index 126425377a3a..97b7cc0e0bbe 100644 --- a/config/eslint/eslint.seatbelt.tsv +++ b/config/eslint/eslint.seatbelt.tsv @@ -46,6 +46,8 @@ "../../server/victory-chart-renderer/src/initSkiaForCli.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/ActionSheetAwareScrollView/useActionSheetAwareScrollViewRef.ts" "react-hooks/immutability" 1 "../../src/components/ActionSheetAwareScrollView/useActionSheetKeyboardSpacing.ts" "@typescript-eslint/no-deprecated/useScrollViewOffset" 1 +"../../src/components/AddPaymentCard/PaymentCardForm.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/components/AddPaymentMethodMenu.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/AddPlaidBankAccount.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/AddressForm.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/AddressSearch/CurrentLocationButton.tsx" "no-restricted-syntax" 1 @@ -136,14 +138,18 @@ "../../src/components/DragAndDrop/Provider/index.tsx" "react-hooks/refs" 6 "../../src/components/DraggableList/SortableItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/DropZone/DropZoneWrapper.tsx" "react-hooks/refs" 1 +"../../src/components/DynamicForm/components/DynamicFormListItemModal.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/components/DynamicForm/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/EditableCell/usePopoverEditState.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/EmojiPicker/EmojiPicker.tsx" "react-hooks/refs" 3 "../../src/components/EmojiPicker/EmojiPickerMenu/useEmojiPickerMenu.ts" "react-hooks/set-state-in-effect" 2 "../../src/components/EmojiPicker/EmojiSkinToneList.tsx" "react-hooks/set-state-in-effect" 2 "../../src/components/EmptySelectionListContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/EReceiptWithSizeCalculation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/ExportDownloadStatusManager.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/FeatureList.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/components/FeedbackSurvey.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/components/FeedbackSurvey.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/FilePicker/index.native.tsx" "react-hooks/refs" 1 "../../src/components/FilePicker/index.tsx" "react-hooks/refs" 1 "../../src/components/FlatList/hooks/useFlatListHandle.ts" "@typescript-eslint/no-unsafe-type-assertion" 3 @@ -153,6 +159,7 @@ "../../src/components/Form/FormProvider.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Form/FormProvider.tsx" "react-hooks/immutability" 2 "../../src/components/Form/FormProvider.tsx" "react-hooks/refs" 2 +"../../src/components/Form/FormProvider.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/Form/InputWrapper.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Form/InputWrapper.tsx" "react-hooks/refs" 1 "../../src/components/HeaderPageLayout.tsx" "no-restricted-imports" 2 @@ -271,6 +278,7 @@ "../../src/components/PopoverMenu/index.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/components/PopoverMenu/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/PopoverMenu/index.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/components/PopoverMenu/v2/content/useCloseOnModalCover.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/components/PopoverMenu/v2/rows/Item.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/components/PopoverMenu/v2/rows/Label.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/components/PopoverMenu/v2/rows/RadioItem.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 @@ -284,6 +292,9 @@ "../../src/components/PressableWithSecondaryInteraction/index.native.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/PressableWithSecondaryInteraction/index.native.tsx" "no-restricted-syntax" 1 "../../src/components/PressableWithSecondaryInteraction/index.tsx" "no-restricted-syntax" 1 +"../../src/components/PriorityModeController.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/components/ProductMarketingWindow/ProductMarketingWindowManager.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/components/ProductTrainingContext/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/PromotedActionsBar.tsx" "no-restricted-imports" 1 "../../src/components/PushRowWithModal/index.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/components/PushRowWithModal/PushRowModal.tsx" "no-restricted-imports" 1 @@ -305,18 +316,23 @@ "../../src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx" "@typescript-eslint/no-deprecated/fontSize" 2 "../../src/components/ReportActionItem/TripDetailsView.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/components/ReportActionItem/TripRoomPreview.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 +"../../src/components/RequireFieldsRules/FieldRequirementSettingRow.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/RNMarkdownTextInput.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/RNMaskedTextInput.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/RoomHeaderAvatars.tsx" "no-restricted-syntax" 2 "../../src/components/Rule/RuleBooleanBase.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Rule/RuleBooleanBase.tsx" "no-restricted-imports" 1 +"../../src/components/Rule/RuleNotFoundPageWrapper.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/Rule/RuleSelectionBase.tsx" "no-restricted-imports" 1 "../../src/components/Rule/RuleTextBase.tsx" "no-restricted-imports" 1 "../../src/components/Rule/TextBase.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/SAMLLoadingIndicator.tsx" "@typescript-eslint/no-deprecated/fontSize" 1 +"../../src/components/ScreenWrapper/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/ScreenWrapper/ScreenWrapperContainer.tsx" "react-hooks/refs" 2 "../../src/components/Search/chartGroupByConfig.ts" "@typescript-eslint/no-unsafe-type-assertion" 20 "../../src/components/Search/FilterComponents/AdvancedFilters/DateFilterContent.tsx" "no-restricted-imports" 1 +"../../src/components/Search/FilterComponents/BankAccountSelector.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/components/Search/FilterComponents/CardSelector.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/Search/FilterComponents/DateFilterBase.tsx" "no-restricted-imports" 1 "../../src/components/Search/FilterComponents/DateFilterBase.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/Search/FilterComponents/DatePresetFilterBase.tsx" "@typescript-eslint/no-deprecated/MenuItem" 2 @@ -326,6 +342,7 @@ "../../src/components/Search/FilterComponents/ReportField/index.tsx" "no-restricted-imports" 1 "../../src/components/Search/FilterComponents/SingleSelect.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/FilterComponents/TypeSelector.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Search/FilterComponents/WorkspaceSelector.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/Search/FilterDropdowns/AmountPopup.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/components/Search/FilterDropdowns/BasePopup.tsx" "no-restricted-imports" 1 "../../src/components/Search/FilterDropdowns/DateSelectPopup/SelectedDateModifierHeader.tsx" "no-restricted-imports" 1 @@ -337,6 +354,8 @@ "../../src/components/Search/index.tsx" "react-hooks/preserve-manual-memoization" 2 "../../src/components/Search/index.tsx" "react-hooks/refs" 5 "../../src/components/Search/index.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/components/Search/index.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/components/Search/SearchAutocompleteList.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/Search/SearchBulkActionsButton.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Search/SearchContextDefinitions.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/SearchList/ListItem/BaseListItemHeader.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -400,7 +419,10 @@ "../../src/components/Table/Table.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/components/Table/TableContext.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/components/Tables/WorkspaceCategoryRulesTable/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Tables/WorkspaceCompanyCardsTable/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/Tables/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableRow.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Tables/WorkspaceListTable/LeaveWorkspaceFlow.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/components/Tables/WorkspaceListTable/TransferOwnershipFlow.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/TabSelector/getBackground.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/TagPicker/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/TaxPicker.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -438,6 +460,7 @@ "../../src/components/TransactionItemRow/DataCells/MerchantCell.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/UploadFile.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/UserInitialsAvatar.tsx" "@typescript-eslint/no-deprecated/fontSize" 1 +"../../src/components/ValidateCodeActionModal/ValidateCodeActionContent.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/ValidateCodeInput.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/ValidateCodeInput.tsx" "react-hooks/set-state-in-effect" 3 "../../src/components/ValuePicker/index.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 @@ -456,16 +479,19 @@ "../../src/components/withViewportOffsetTop.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/WorkspaceConfirmationForm.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 2 "../../src/components/WorkspaceConfirmationForm.tsx" "no-restricted-imports" 1 +"../../src/components/WorkspaceConfirmationForm.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/WorkspaceMemberRoleList.tsx" "no-restricted-imports" 1 "../../src/components/ZeroWidthView/index.tsx" "no-restricted-syntax" 2 "../../src/CONST/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/CONST/runtimeConfigured.ts" "rulesdir/no-direct-personal-details-list" 1 "../../src/DeepLinkHandler.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/DeepLinkHandler.tsx" "no-restricted-syntax" 1 +"../../src/DeepLinkHandler.tsx" "rulesdir/no-onyx-loading-status" 8 "../../src/Expensify.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/Expensify.tsx" "no-restricted-syntax" 1 "../../src/Expensify.tsx" "react-hooks/refs" 1 "../../src/Expensify.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/FullstoryInitHandler.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/GlobalModals.tsx" "no-restricted-syntax" 2 "../../src/hooks/useAccountIndicatorChecks.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/hooks/useAdvancedSearchFilters.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -483,24 +509,43 @@ "../../src/hooks/useCardFeedsForActivePolicies.ts" "no-restricted-imports" 1 "../../src/hooks/useCardFeedsForDisplay.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useCardFeedsForDisplay.ts" "no-restricted-imports" 1 +"../../src/hooks/useCarouselTransactionIDs.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useCompanyCards.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useContactPermissionModal/index.native.ts" "rulesdir/no-onyx-loading-status" 2 +"../../src/hooks/useCreateReport.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useDebounce.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useDebouncedValue.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useDebounceNonReactive.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/hooks/useDefaultParticipants.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useDragAndDrop/types.ts" "@typescript-eslint/no-deprecated/React.MutableRefObject" 1 +"../../src/hooks/useExpensifyCardRulesList.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useExportedToFilterOptions.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useFilterFormValues.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/hooks/useGPSTripStateChecker/index.native.ts" "rulesdir/no-onyx-loading-status" 3 +"../../src/hooks/useHasLoggedIntoMobileApp.ts" "rulesdir/no-onyx-loading-status" 4 +"../../src/hooks/useHasPhoneNumberLogin.ts" "rulesdir/no-onyx-loading-status" 2 +"../../src/hooks/useHasReportAwaitingApproval.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useHydrateReportsFromSnapshot.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useImportSpreadsheetConfirmModal.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/hooks/useInFlightRequests.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useInitial.ts" "react-hooks/refs" 4 +"../../src/hooks/useInitialOnyxValue.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useInitialSelection.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/hooks/useIsAgentAccount.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useIsBlockedToAddFeed.ts" "react-hooks/set-state-in-effect" 1 +"../../src/hooks/useIsBlockedToAddFeed.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useIsDomainUsingCard.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useIsLoadingAppRecovery.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useIsOwnWorkspaceChatRef.ts" "react-hooks/refs" 2 "../../src/hooks/useIsPaidPolicyAdmin.ts" "no-restricted-imports" 1 "../../src/hooks/useKeyboardShortcut.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useLazyAsset.ts" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/hooks/useLazyAsset.ts" "react-hooks/set-state-in-effect" 1 +"../../src/hooks/useLoadDepositAccountSetup.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useMarkdownStyle.ts" "rulesdir/no-raw-typography" 3 +"../../src/hooks/useMergeResultConfirmationConfig.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useNewTransactions.ts" "react-hooks/refs" 2 +"../../src/hooks/useOnboardingFlow.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useOnyx.ts" "@typescript-eslint/no-unsafe-type-assertion" 10 "../../src/hooks/useOptimisticDraftTransactions.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useOtherFeedsForFeedSelector.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -508,26 +553,47 @@ "../../src/hooks/useParticipantSubmission.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/usePaymentOptions.ts" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/hooks/usePaymentOptions.ts" "react-hooks/refs" 1 +"../../src/hooks/usePaymentOptions.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/usePersonalDetailOptions.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/usePersonalPolicy.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/hooks/usePolicyConnectionsPrefetch.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/usePolicyData/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/hooks/usePolicyForMovingExpenses.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/usePreferredCurrency.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/usePrevious.ts" "react-hooks/refs" 1 +"../../src/hooks/usePrivateSubscription.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useReportScrollManager/index.native.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useResetBankAccountModal.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useResponsiveLayout/index.native.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useResponsiveLayout/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/hooks/useRestartOnOdometerImagesFailure/index.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useRestartOnReceiptFailure.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useRestoreWorkspacesTabOnNavigate.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useReviewDuplicatesNavigation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useReviewDuplicatesNavigation.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/hooks/useRulesPrefetch.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useSaveMarketingAttribution.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useSearchBulkActions.ts" "@typescript-eslint/no-unsafe-type-assertion" 9 +"../../src/hooks/useSearchFilterSync.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useSearchLoadingState.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useSeedMyExpensesSearch.ts" "rulesdir/no-onyx-loading-status" 2 +"../../src/hooks/useSelfDMReport.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useShouldSuppressPromotionalUI.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useSidebarOrderedReports.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useSidebarOrderedReports.tsx" "react-hooks/refs" 5 "../../src/hooks/useSidebarOrderedReports.tsx" "react-hooks/set-state-in-effect" 1 "../../src/hooks/useSingleExecution/index.native.ts" "react-hooks/refs" 1 +"../../src/hooks/useSingleExpenseReportView.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useStableIndexedHandler.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useStepFormSubmit.ts" "no-restricted-syntax" 1 "../../src/hooks/useSubPage/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/hooks/useSuggestedAgentRules.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useSuggestedAgents.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useTodoCounts.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useTodoSearchResults.ts" "rulesdir/no-onyx-loading-status" 2 "../../src/hooks/useTransactionViolationOfWorkspace.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/hooks/useTrialPaymentReminder.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useUserSecurityGroup.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useViolations.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useWorkletStateMachine/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/languages/flattenObject.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -768,6 +834,7 @@ "../../src/libs/Navigation/AppNavigator/KeyboardShortcutsHandler/SearchHandler.tsx" "no-restricted-syntax" 1 "../../src/libs/Navigation/AppNavigator/KeyboardShortcutsHandler/ShortcutsOverviewHandler.tsx" "no-restricted-syntax" 1 "../../src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 5 +"../../src/libs/Navigation/AppNavigator/Navigators/OnboardingModalNavigator.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/libs/Navigation/AppNavigator/Navigators/Overlay/BaseOverlay.tsx" "no-restricted-syntax" 2 "../../src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx" "no-restricted-syntax" 1 @@ -810,10 +877,12 @@ "../../src/libs/Navigation/linkingConfig/config.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/libs/Navigation/linkingConfig/RELATIONS/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/libs/Navigation/Navigation.ts" "@typescript-eslint/no-unsafe-type-assertion" 10 +"../../src/libs/Navigation/OnyxTabNavigator.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/libs/Navigation/PlatformStackNavigation/createPlatformStackNavigatorComponent/index.native.tsx" "@typescript-eslint/no-deprecated/NavigationContent" 1 "../../src/libs/Navigation/PlatformStackNavigation/createPlatformStackNavigatorComponent/index.tsx" "@typescript-eslint/no-deprecated/NavigationContent" 1 "../../src/libs/Navigation/PlatformStackNavigation/navigationOptions/animation/withAnimation.ts" "@typescript-eslint/no-unsafe-type-assertion" 6 "../../src/libs/Navigation/PlatformStackNavigation/ScreenLayout.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/libs/Navigation/useNavigateTo3DSAuthorizationChallenge.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/libs/NetSuiteUtils.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/libs/Network/enhanceParameters.ts" "no-restricted-syntax" 1 "../../src/libs/Network/index.ts" "no-restricted-syntax" 1 @@ -892,6 +961,7 @@ "../../src/pages/AddressPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/AddressPage.tsx" "no-restricted-imports" 1 "../../src/pages/AddressPage.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/AvatarCropPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/ChronosScheduleOOOPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/ChronosScheduleOOOPage.tsx" "no-restricted-imports" 1 "../../src/pages/Debug/ConstantPicker.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -912,6 +982,7 @@ "../../src/pages/Debug/TransactionViolation/DebugTransactionViolationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Debug/TransactionViolation/DebugTransactionViolationPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/AddDomainPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/AddDomainPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/domain/Admins/DomainAddAdminPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/Admins/DomainAddPrimaryContactPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/Admins/DomainAdminsPage.tsx" "no-restricted-imports" 1 @@ -920,13 +991,21 @@ "../../src/pages/domain/BaseDomainRequireTwoFactorAuthPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/BaseDomainSettingsPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/BaseDomainVerifiedPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/BaseDomainVerifiedPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/domain/BaseVerifyDomainPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/BaseVerifyDomainPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/domain/DomainAccessRestrictedPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/DomainAddedPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/DomainAddedPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/domain/DomainAlreadyExistsPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/DomainInitialPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/DomainInitialPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/domain/DomainNameOrNotFoundWrapper.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/domain/DomainNotFoundPageWrapper.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/domain/DomainResetPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/DomainResetPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/domain/DomainSamlPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/DomainSamlPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/domain/Groups/BaseDomainGroupPreferredWorkspacePage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/Groups/DomainGroupCreatePage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/Groups/DomainGroupDetailsPage.tsx" "no-restricted-imports" 1 @@ -936,13 +1015,16 @@ "../../src/pages/domain/Members/DomainMembersPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/Members/MoveUserBetweenGroupsPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/Members/MoveUsersBetweenGroupsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/Saml/SamlConfigurationDetailsSectionContent.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/DynamicEditReportFieldPage.tsx" "no-restricted-imports" 1 "../../src/pages/DynamicFlagCommentPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/DynamicFlagCommentPage.tsx" "no-restricted-imports" 1 "../../src/pages/DynamicNewReportWorkspaceSelectionPage.tsx" "no-restricted-imports" 1 +"../../src/pages/DynamicNewReportWorkspaceSelectionPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/DynamicReferralDetailsPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/DynamicReportChangeApproverPage.tsx" "no-restricted-imports" 1 "../../src/pages/DynamicReportChangeWorkspacePage.tsx" "no-restricted-imports" 1 +"../../src/pages/DynamicReportChangeWorkspacePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/DynamicReportDetailsPage/ReportDetailsContent.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 2 "../../src/pages/DynamicReportDetailsPage/ReportDetailsMenuDebugItem.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/DynamicReportDetailsPage/ReportDetailsMenuGoToRoomItem.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 @@ -977,9 +1059,15 @@ "../../src/pages/EnablePayments/Wallet/utils/getSubstepValues.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/EnablePayments/Wallet/VerifyIdentity/VerifyIdentity.tsx" "no-restricted-imports" 1 "../../src/pages/GroupChatNameEditPage.tsx" "no-restricted-imports" 1 +"../../src/pages/GroupChatNameEditPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/home/EarlyRenewalOfferSection/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/home/ForYouSection/ConciergePromptBox.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/home/GettingStartedSection/hooks/useGettingStartedItems.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/home/GettingStartedSection/hooks/useGettingStartedItems.ts" "no-restricted-imports" 1 +"../../src/pages/home/InsightsSection/InsightsSectionContent.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/home/TimeSensitiveSection/hooks/useTimeSensitiveAddBankAccount.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/home/TimeSensitiveSection/hooks/useTimeSensitiveAddDepositAccount.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/home/TimeSensitiveSection/hooks/useTimeSensitiveOverdueInvoice.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/home/TimeSensitiveSection/items/FixCompanyCardConnection.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/home/UpcomingTravelSection/UpcomingTravelItem.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/home/YourSpendSection/CardRow.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 @@ -1004,6 +1092,7 @@ "../../src/pages/inbox/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/inbox/report/ReportActionCompose/ComposerWithSuggestions.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/inbox/report/ReportActionCompose/ComposerWithSuggestions.tsx" "react-hooks/refs" 7 +"../../src/pages/inbox/report/ReportActionCompose/SilentCommentUpdater/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/inbox/report/ReportActionCompose/SuggestionEmoji.tsx" "react-hooks/refs" 1 "../../src/pages/inbox/report/ReportActionCompose/SuggestionMention.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/inbox/report/ReportActionCompose/SuggestionMention.tsx" "react-hooks/refs" 3 @@ -1016,6 +1105,7 @@ "../../src/pages/inbox/report/ReportActionItemMessageEdit.tsx" "no-restricted-syntax" 1 "../../src/pages/inbox/report/ReportActionItemMessageEdit.tsx" "react-hooks/refs" 5 "../../src/pages/inbox/report/ReportActionItemMessageEdit.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/inbox/report/ReportActionsListContext.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/inbox/report/SearchActionHeader.tsx" "@typescript-eslint/no-deprecated/fontSize" 1 "../../src/pages/inbox/report/shouldUseEmojiPickerSelection/index.web.ts" "no-restricted-syntax" 1 "../../src/pages/inbox/report/TripSummary.tsx" "rulesdir/no-default-id-values" 1 @@ -1027,11 +1117,13 @@ "../../src/pages/inbox/report/withReportOrNotFound.tsx" "react-hooks/refs" 3 "../../src/pages/inbox/ReportHeader.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/inbox/ReportNavigateAwayHandler.tsx" "react-hooks/exhaustive-deps" 1 +"../../src/pages/inbox/ReportRouteParamHandler.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/inbox/sidebar/FABPopoverContent/FABFocusableMenuItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/inbox/sidebar/FABPopoverContent/menuItems/InvoiceMenuItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/inbox/sidebar/FABPopoverContent/menuItems/NewWorkspaceMenuItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/inbox/sidebar/FABPopoverContent/menuItems/TravelMenuItem.tsx" "no-restricted-imports" 1 "../../src/pages/inbox/sidebar/FABPopoverContent/useScanActions.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/Insights/useInsightsFilters.ts" "rulesdir/no-onyx-loading-status" 3 "../../src/pages/iou/DynamicSplitBillDetailsPage.tsx" "no-restricted-imports" 1 "../../src/pages/iou/DynamicSplitExpenseCreateDateRangePage.tsx" "no-restricted-imports" 1 "../../src/pages/iou/DynamicSplitExpenseEditPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 @@ -1040,15 +1132,20 @@ "../../src/pages/iou/DynamicSplitExpensePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/iou/DynamicSplitExpensePage.tsx" "no-restricted-imports" 1 "../../src/pages/iou/DynamicSplitExpensePage.tsx" "react-hooks/set-state-in-effect" 3 +"../../src/pages/iou/DynamicSplitExpensePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/iou/HoldReasonFormView.tsx" "no-restricted-imports" 1 "../../src/pages/iou/MoneyRequestAmountForm.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/iou/RejectReasonFormView.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/DistanceRequestStartPage.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/request/DistanceRequestStartPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/iou/request/IOURequestStartPage.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/request/IOURequestStartPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/iou/request/ParticipantSearchResults.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/pages/iou/request/step/DistanceManualTabContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/DynamicIOURequestEditReport.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/iou/request/step/DynamicIOURequestStepDestination.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/iou/request/step/DynamicIOURequestStepDistance.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/iou/request/step/DynamicIOURequestStepDistance.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/iou/request/step/DynamicIOURequestStepReport.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/iou/request/step/DynamicIOURequestStepSubrate.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/DynamicIOURequestStepSubrate.tsx" "no-restricted-imports" 1 @@ -1063,9 +1160,12 @@ "../../src/pages/iou/request/step/IOURequestStepConfirmation/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/iou/request/step/IOURequestStepConfirmation/index.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepConfirmation/index.tsx" "react-hooks/preserve-manual-memoization" 1 +"../../src/pages/iou/request/step/IOURequestStepConfirmation/useConfirmationTransactionPager.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/iou/request/step/IOURequestStepCurrencyModal.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepDistanceGPS/Waypoints/index.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 2 "../../src/pages/iou/request/step/IOURequestStepDistanceMap.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/iou/request/step/IOURequestStepDistanceMap.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/iou/request/step/IOURequestStepOdometerImage/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/IOURequestStepScan/components/NavigationAwareCamera/WebCamera.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/IOURequestStepScan/components/ScanEditReceipt.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1073,14 +1173,17 @@ "../../src/pages/iou/request/step/IOURequestStepScan/DynamicReceiptView/index.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepScan/DynamicReceiptView/index.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/iou/request/step/IOURequestStepScan/hooks/useScanRouteParams.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/iou/request/step/IOURequestStepScan/ScanRouter.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/iou/request/step/IOURequestStepScan/utils/buildReceiptFiles.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/IOURequestStepScan/utils/getFileSource.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/StepScreenDragAndDropWrapper.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/StepScreenWrapper.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/StepScreenWrapper.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/withFullTransactionOrNotFound.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/iou/request/step/withFullTransactionOrNotFound.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/iou/request/step/withWritableReportOrNotFound.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/LoadingPage.tsx" "no-restricted-imports" 1 +"../../src/pages/LogInWithShortLivedAuthTokenPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/media/AttachmentModalScreen/AttachmentModalBaseContent/index.tsx" "no-restricted-imports" 1 "../../src/pages/media/AttachmentModalScreen/AttachmentModalBaseContent/index.tsx" "react-hooks/set-state-in-effect" 3 "../../src/pages/media/AttachmentModalScreen/AttachmentModalContext.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1088,6 +1191,7 @@ "../../src/pages/media/AttachmentModalScreen/routes/hooks/useReportAttachmentModalType.ts" "react-hooks/set-state-in-effect" 1 "../../src/pages/media/AttachmentModalScreen/routes/TransactionReceiptModalContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 "../../src/pages/media/AttachmentModalScreen/routes/TransactionReceiptModalContent.tsx" "react-hooks/set-state-in-effect" 2 +"../../src/pages/MissingPersonalDetails/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx" "no-restricted-imports" 1 "../../src/pages/MissingPersonalDetails/MissingPersonalDetailsValidateCodePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1100,11 +1204,15 @@ "../../src/pages/MultifactorAuthentication/ValidateCodePage.tsx" "no-restricted-imports" 1 "../../src/pages/NewChatConfirmPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/NewChatConfirmPage.tsx" "no-restricted-imports" 1 +"../../src/pages/NewChatConfirmPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/NewChatPage/useGroupChatDraftParticipantSync.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/NewChatSelectorPage.tsx" "no-restricted-imports" 1 "../../src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/OnboardingPersonalTrackGoal/BaseOnboardingPersonalTrackGoal.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/OnboardingPrivateDomain/BaseOnboardingPrivateDomain.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/PrivateNotes/PrivateNotesEditPage.tsx" "no-restricted-imports" 1 +"../../src/pages/PrivateNotes/PrivateNotesEditPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/PrivateNotes/PrivateNotesListPage.tsx" "no-restricted-imports" 1 "../../src/pages/ProfilePage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/ProfilePage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 5 @@ -1134,16 +1242,27 @@ "../../src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx" "no-restricted-imports" 1 "../../src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx" "react-hooks/refs" 3 "../../src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx" "react-hooks/set-state-in-effect" 4 +"../../src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/USD/BeneficialOwnerInfo/subSteps/BeneficialOwnerDetailsFormSubSteps/LegalNameUBO.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/AddressBusiness.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/ConfirmationBusiness.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/IncorporationDateBusiness.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/IncorporationStateBusiness.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/IndustryCode/IndustryCodeSelector.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/PhoneNumberBusiness.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/TaxIdBusiness.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/TypeBusiness/BusinessTypePicker/BusinessTypeSelectorModal.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/TypeBusiness/BusinessTypePicker/BusinessTypeSelectorModal.tsx" "no-restricted-imports" 1 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/TypeBusiness/BusinessTypePicker/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/TypeBusiness/TypeBusiness.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/WebsiteBusiness.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/WebsiteBusiness.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/ReimbursementAccount/USD/ConnectBankAccount/ConnectBankAccount.tsx" "no-restricted-imports" 1 +"../../src/pages/ReimbursementAccount/USD/Requestor/PersonalInfo/subSteps/Address.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/ReimbursementAccount/USD/Requestor/PersonalInfo/subSteps/DateOfBirth.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/ReimbursementAccount/USD/Requestor/PersonalInfo/subSteps/SocialSecurityNumber.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/ReimbursementAccount/utils/getSubStepValues.ts" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/pages/ReimbursementAccount/VerifiedBankAccountFlowEntryPoint.tsx" "no-restricted-imports" 1 "../../src/pages/RejectExpenseReportPage.tsx" "no-restricted-imports" 1 @@ -1178,15 +1297,20 @@ "../../src/pages/Search/SearchMoneyRequestReportPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/Search/SearchPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/Search/SearchPageNarrow/index.tsx" "no-restricted-imports" 1 +"../../src/pages/Search/SearchReportsMergeReports.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/Search/SearchSavePage.tsx" "no-restricted-imports" 1 "../../src/pages/Search/SearchTransactionsChangeReport.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/SetDefaultWorkspacePage.tsx" "no-restricted-imports" 1 +"../../src/pages/SetDefaultWorkspacePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/AboutPage/AboutPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/AboutPage/AboutPage.tsx" "react-hooks/refs" 1 "../../src/pages/settings/Agents/AgentsPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Agents/DynamicAddAgentPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Agents/DynamicAddAgentPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Agents/DynamicEditAgentPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Agents/DynamicEditAgentPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Agents/DynamicNewAgentPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Agents/Fields/DynamicAddAgentAvatarPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Agents/Fields/DynamicEditAgentAvatarPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Agents/Fields/DynamicEditNamePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Agents/Fields/DynamicEditPromptPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1196,6 +1320,7 @@ "../../src/pages/settings/Copilot/CopilotPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/DynamicKeyboardShortcutsPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/settings/DynamicKeyboardShortcutsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/EmailIssue/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx" "no-restricted-imports" 1 @@ -1210,10 +1335,12 @@ "../../src/pages/settings/Profile/Contacts/DynamicContactMethodDetailsPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/Contacts/DynamicContactMethodDetailsPage.tsx" "react-hooks/refs" 3 "../../src/pages/settings/Profile/Contacts/DynamicContactMethodDetailsPage.tsx" "react-hooks/set-state-in-effect" 3 +"../../src/pages/settings/Profile/Contacts/DynamicContactMethodDetailsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Profile/Contacts/DynamicContactMethodsPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/settings/Profile/Contacts/DynamicContactMethodsPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/Contacts/DynamicNewContactMethodPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/CustomStatus/SetDatePage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Profile/CustomStatus/SetDatePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Profile/CustomStatus/SetTimePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/CustomStatus/StatusClearAfterPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 2 "../../src/pages/settings/Profile/CustomStatus/StatusClearAfterPage.tsx" "no-restricted-imports" 1 @@ -1222,6 +1349,7 @@ "../../src/pages/settings/Profile/CustomStatus/StatusPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/CustomStatus/StatusPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/settings/Profile/CustomStatus/VacationDelegateMissingWorkspacesPage/index.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Profile/CustomStatus/VacationDelegateMissingWorkspacesPage/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Profile/DisplayNamePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/PersonalDetails/BaseLegalNamePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/PersonalDetails/DynamicCountrySelectionPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1229,6 +1357,7 @@ "../../src/pages/settings/Profile/PersonalDetails/DynamicStateSelectionPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Profile/PersonalDetails/DynamicStateSelectionPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/PersonalDetails/PersonalAddressPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/settings/Profile/PersonalDetails/PersonalAddressPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsConfirmValidateCodePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 8 "../../src/pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsPage.tsx" "no-restricted-imports" 1 @@ -1247,6 +1376,7 @@ "../../src/pages/settings/Report/DynamicWriteCapabilityPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Report/RoomNamePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Rules/ExpenseRulesPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Rules/ExpenseRulesPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Rules/RulePageBase.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Security/AddDelegate/AddDelegatePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Security/AddDelegate/ConfirmDelegatePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1255,6 +1385,7 @@ "../../src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateRolePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateValidateCodePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Security/CloseAccount/CloseAccountPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Security/CloseAccount/CloseAccountValidateCodePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Security/DeviceManagementPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Security/LockAccount/FailedToLockAccountPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Security/LockAccount/UnlockAccountPage.tsx" "no-restricted-imports" 1 @@ -1262,11 +1393,17 @@ "../../src/pages/settings/Security/MergeAccounts/AccountValidatePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Security/MergeAccounts/MergeResultPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Security/SecuritySettingsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Security/TwoFactorAuth/DynamicSuccessPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/settings/Security/TwoFactorAuth/DynamicTwoFactorAuthPage.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/settings/Security/TwoFactorAuth/EnabledPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 +"../../src/pages/settings/Security/TwoFactorAuth/SuccessPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthWrapper.tsx" "no-restricted-imports" 1 "../../src/pages/settings/SettingsMenuItem.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/settings/Subscription/CancelSubscriptionPage/index.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Subscription/CancelSubscriptionPage/index.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/settings/Subscription/CardSection/CardSection.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Subscription/DisableAutoRenewSurveyPage/index.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Subscription/EarlyRenewalOfferPage/index.web.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Subscription/ExpensifyCodePage/index.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Subscription/PaymentCard/ChangeBillingCurrency/index.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Subscription/PaymentCard/ChangeBillingCurrency/index.tsx" "no-restricted-syntax" 1 @@ -1284,8 +1421,11 @@ "../../src/pages/settings/Troubleshoot/DynamicBetaOverridesPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Troubleshoot/ServerSelector.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Troubleshoot/TroubleshootPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Troubleshoot/TroubleshootPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/settings/useInitialSettingsPageMenuData.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/VerifyAccountPageBase.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/AddCardToDigitalWalletPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/AddCardToDigitalWalletPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/AddDebitCardPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/BankAccountPurposePage/index.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/BankAccountPurposePage/substeps/BankAccountPurpose.tsx" "@typescript-eslint/no-deprecated/MenuItem" 2 @@ -1293,30 +1433,42 @@ "../../src/pages/settings/Wallet/CardAddedToWalletPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/ChooseTransferAccountPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Wallet/ChooseTransferAccountPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/ChooseTransferAccountPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/CountrySelectionList.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Wallet/EditBankAccountNicknamePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsAgreementsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsBusinessPage/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsSignPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/ExpensifyCardPage/ChangePINPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/ExpensifyCardPage/index.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 2 "../../src/pages/settings/Wallet/ExpensifyCardPage/index.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/ExpensifyCardPage/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/ImportTransactionsCardNamePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/ImportTransactionsCurrencyPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/ImportTransactionsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/ImportTransactionsSpreadsheetPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/settings/Wallet/InternationalDepositAccount/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/InternationalDepositAccount/InternationalDepositAccountContent.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/InternationalDepositAccount/subPages/AccountFlowEntryPoint.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/InternationalDepositAccount/subPages/AccountFlowEntryPoint.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/InternationalDepositAccount/subPages/Confirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/InternationalDepositAccount/utils.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/PaymentMethodList.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/settings/Wallet/PaymentMethodList.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 +"../../src/pages/settings/Wallet/PaymentMethodList.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/PaymentMethodListItem.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/settings/Wallet/PersonalCardDetailsHeaderMenu.tsx" "@typescript-eslint/no-deprecated/MenuItem" 2 "../../src/pages/settings/Wallet/PersonalCardDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/PersonalCardDetailsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/PersonalCardDetailsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/PersonalCardEditNamePage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/PersonalCardEditNamePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/PersonalCardEditTransactionStartDatePage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/PersonalCards/AddNewCardPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/PersonalCards/FixPersonalCardConnectionPage/index.native.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/PersonalCards/FixPersonalCardConnectionPage/index.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/PersonalCards/FixPersonalCardConnectionPage/useFixPersonalCardConnection.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/settings/Wallet/PersonalCards/FixPersonalCardConnectionPage/useFixPersonalCardConnection.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/PersonalCards/steps/BankConnection/index.native.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/PersonalCards/steps/BankConnection/index.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/PersonalCards/steps/PlaidConnectionStep.tsx" "no-restricted-imports" 1 @@ -1333,17 +1485,21 @@ "../../src/pages/settings/Wallet/ShareBankAccount/ShareBankAccount.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/ShareBankAccount/ShareBankAccount.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/settings/Wallet/TransactionsImportedPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/TransactionsImportedPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/TransferBalancePage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 2 "../../src/pages/settings/Wallet/TransferBalancePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/TravelCVVPage/TravelCVVPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/TravelCVVPage/TravelCVVPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/UnshareBankAccount/UnshareBankAccount.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/UpdatePersonalBankAccountPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Wallet/UpdatePersonalBankAccountPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/UpdatePersonalBankAccountPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Wallet/WalletPage/CardDetails.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 4 "../../src/pages/settings/Wallet/WalletPage/index.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/settings/Wallet/WalletPage/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/WalletPage/index.tsx" "no-restricted-imports" 2 "../../src/pages/settings/Wallet/WalletPage/index.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/settings/Wallet/WiseGlobalReimbursementsIntroPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/Share/ShareDetailsPage.tsx" "no-restricted-imports" 1 "../../src/pages/Share/ShareRootPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Share/ShareRootPage.tsx" "no-restricted-imports" 1 @@ -1362,9 +1518,11 @@ "../../src/pages/signin/SMSDeliveryFailurePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx" "react-hooks/set-state-in-effect" 4 "../../src/pages/tasks/DynamicNewTaskDescriptionPage.tsx" "no-restricted-imports" 1 +"../../src/pages/tasks/DynamicNewTaskDescriptionPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/tasks/DynamicNewTaskDetailsPage.tsx" "no-restricted-imports" 1 "../../src/pages/tasks/DynamicNewTaskPage.tsx" "no-restricted-imports" 1 "../../src/pages/tasks/DynamicNewTaskTitlePage.tsx" "no-restricted-imports" 1 +"../../src/pages/tasks/DynamicNewTaskTitlePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/tasks/DynamicTaskAssigneeSelectorModal.tsx" "no-restricted-imports" 1 "../../src/pages/tasks/DynamicTaskShareDestinationSelectorModal.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/tasks/DynamicTaskShareDestinationSelectorModal.tsx" "no-restricted-imports" 1 @@ -1375,11 +1533,13 @@ "../../src/pages/TeachersUnite/KnowATeacherPage.tsx" "no-restricted-imports" 1 "../../src/pages/TeachersUnite/SaveTheWorldPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/TeachersUnite/SaveTheWorldPage.tsx" "no-restricted-imports" 1 +"../../src/pages/TrackExpensePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/TransactionDuplicate/DuplicateTransactionItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/TransactionDuplicate/DynamicConfirmationPage.tsx" "@typescript-eslint/no-deprecated/fontSize" 1 "../../src/pages/TransactionDuplicate/DynamicConfirmationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/TransactionDuplicate/DynamicConfirmationPage.tsx" "no-restricted-imports" 2 "../../src/pages/TransactionDuplicate/DynamicConfirmationPage.tsx" "react-hooks/refs" 12 +"../../src/pages/TransactionDuplicate/DynamicConfirmationPage.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/TransactionDuplicate/DynamicReviewBillablePage.tsx" "no-restricted-imports" 1 "../../src/pages/TransactionDuplicate/DynamicReviewCategoryPage.tsx" "no-restricted-imports" 1 "../../src/pages/TransactionDuplicate/DynamicReviewDescriptionPage.tsx" "no-restricted-imports" 1 @@ -1391,10 +1551,14 @@ "../../src/pages/TransactionDuplicate/ReviewFields.tsx" "@typescript-eslint/no-deprecated/fontSize" 1 "../../src/pages/TransactionMerge/DynamicConfirmationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/TransactionMerge/DynamicConfirmationPage.tsx" "no-restricted-imports" 1 +"../../src/pages/TransactionMerge/DynamicConfirmationPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/TransactionMerge/DynamicDetailsReviewPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/TransactionMerge/DynamicDetailsReviewPage.tsx" "no-restricted-imports" 1 +"../../src/pages/TransactionMerge/DynamicDetailsReviewPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/TransactionMerge/DynamicMergeTransactionsListPage.tsx" "no-restricted-imports" 1 +"../../src/pages/TransactionMerge/DynamicMergeTransactionsListPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/TransactionMerge/DynamicReceiptReviewPage.tsx" "no-restricted-imports" 1 +"../../src/pages/TransactionMerge/DynamicReceiptReviewPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/TransactionMerge/MergeTransactionItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/TransactionMerge/MergeTransactionsListContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Travel/CarTripDetails.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 2 @@ -1405,6 +1569,7 @@ "../../src/pages/Travel/DynamicTripSummaryPage.tsx" "no-restricted-imports" 1 "../../src/pages/Travel/DynamicWorkspaceConfirmationForTravelPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/Travel/EnableTravel/EnableTravelContent.tsx" "no-restricted-imports" 1 +"../../src/pages/Travel/EnableTravel/index.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/Travel/HotelTripDetails.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 3 "../../src/pages/Travel/MyTripsPage.tsx" "no-restricted-imports" 1 "../../src/pages/Travel/TravelDotLinkWebview.tsx" "no-restricted-imports" 1 @@ -1429,6 +1594,7 @@ "../../src/pages/workspace/accounting/dualentry/DualEntryExistingConnectionsPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/workspace/accounting/dualentry/DualEntryExistingConnectionsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/dualentry/export/DualEntryExportPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/accounting/ExactOnlineWaitlistButton.tsx" "rulesdir/no-onyx-loading-status" 4 "../../src/pages/workspace/accounting/intacct/advanced/DynamicSageIntacctAccountingMethodPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/intacct/DynamicSageIntacctPrerequisitesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/intacct/EnterSageIntacctCredentialsPage.tsx" "no-restricted-imports" 1 @@ -1456,7 +1622,9 @@ "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomersOrProjectsPage.tsx" "rulesdir/no-default-id-values" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldEdit.tsx" "@typescript-eslint/no-unsafe-type-assertion" 12 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/NetSuiteCustomListSelectorPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/NetSuiteImportAddCustomListPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/NetSuiteImportAddCustomSegmentContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/NetSuiteImportAddCustomSegmentPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/NetSuiteMenuWithTopDescriptionForm.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/subPages/ChooseSegmentTypeStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/subPages/ConfirmCustomSegmentList.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -1531,6 +1699,8 @@ "../../src/pages/workspace/accounting/xero/XeroTaxesConfigurationPage.tsx" "no-restricted-syntax" 4 "../../src/pages/workspace/accounting/xero/XeroTaxesConfigurationPage.tsx" "rulesdir/no-default-id-values" 1 "../../src/pages/workspace/accounting/xero/XeroTrackingCategoryConfigurationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/workspace/archiveWorkspace/ArchiveWorkspaceFlow.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/workspace/archiveWorkspace/UnarchiveWorkspaceFlow.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/categories/CategoryGLCodePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/categories/CategoryPayrollCodePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/categories/CategorySettingsPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 @@ -1548,6 +1718,7 @@ "../../src/pages/workspace/categories/DynamicEditCategoryPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/categories/DynamicExpenseLimitTypeSelectorPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/categories/ImportedCategoriesPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/categories/ImportedCategoriesPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/categories/WorkspaceCategoriesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/categories/WorkspaceCategoriesPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/companyCards/addNew/AmexCustomFeed.tsx" "no-restricted-imports" 1 @@ -1556,7 +1727,9 @@ "../../src/pages/workspace/companyCards/addNew/CardTypeStep.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/addNew/CompanyCardLayoutNamePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/addNew/CompanyCardsImportedPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/companyCards/addNew/CompanyCardsImportedPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/addNew/DetailsStep.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/companyCards/addNew/DynamicAddNewCardPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/addNew/ImportFromFileStep.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/addNew/SelectBankStep.tsx" "no-restricted-imports" 1 @@ -1564,6 +1737,7 @@ "../../src/pages/workspace/companyCards/addNew/SelectCountryStep.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/addNew/SelectFeedType.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/assignCard/CardNameStep.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/companyCards/assignCard/TransactionStartDateStep.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/BankConnection/index.native.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/BankConnection/index.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/BankConnection/index.tsx" "react-hooks/set-state-in-effect" 1 @@ -1571,17 +1745,22 @@ "../../src/pages/workspace/companyCards/DynamicWorkspaceCompanyCardDetailsPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/companyCards/DynamicWorkspaceCompanyCardDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/companyCards/DynamicWorkspaceCompanyCardDetailsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/companyCards/DynamicWorkspaceCompanyCardDetailsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardAddWorkEmailPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardAddWorkEmailPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardEditCardNamePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/companyCards/WorkspaceCompanyCardEditCardNamePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardEditTransactionStartDatePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardEditTransactionStartDatePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsErrorConfirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/companyCards/WorkspaceCompanyCardsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/WorkspaceVerifyWorkAccountPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -1593,9 +1772,12 @@ "../../src/pages/workspace/connections/ConnectionsMergeProviderCard.tsx" "@typescript-eslint/no-deprecated/RowMenuItem" 1 "../../src/pages/workspace/connections/ConnectionsReceiptPartnersPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/workspace/copyPolicySettings/CopyPolicySettingsConfirmPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/copyPolicySettings/CopyPolicySettingsConfirmPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/copyPolicySettings/CopyPolicySettingsSelectFeaturesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/copyPolicySettings/CopyPolicySettingsSelectWorkspacesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/copyPolicySettings/CopyPolicySettingsUpgradePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/copyPolicySettings/CopyPolicySettingsUpgradePage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/workspace/deleteWorkspace/DeleteWorkspaceFlow.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/distanceRates/CreateDistanceRatePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/distanceRates/PolicyCommuterExclusionsPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/distanceRates/PolicyCommuterExclusionsPage.tsx" "no-restricted-imports" 1 @@ -1610,12 +1792,15 @@ "../../src/pages/workspace/distanceRates/PolicyDistanceRateTaxReclaimableEditPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/distanceRates/PolicyDistanceRateUnitPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/downgrade/DynamicPayAndDowngradePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/downgrade/DynamicPayAndDowngradePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/downgrade/DynamicWorkspaceDowngradePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/duplicate/WorkspaceDuplicateForm.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/duplicate/WorkspaceDuplicateSelectFeaturesForm.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/duplicate/WorkspaceDuplicateSelectFeaturesForm.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/DynamicWorkspaceConfirmationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/DynamicWorkspaceInviteMessageRolePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/DynamicWorkspaceInvitePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/DynamicWorkspaceInvitePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/DynamicWorkspaceOverviewPlanTypePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/DynamicWorkspaceOverviewPlanTypePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/DynamicWorkspaceOverviewPlanTypePage.tsx" "react-hooks/set-state-in-effect" 1 @@ -1627,11 +1812,13 @@ "../../src/pages/workspace/expensifyCard/DynamicWorkspaceExpensifyCardDetailsPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/workspace/expensifyCard/DynamicWorkspaceExpensifyCardDetailsPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/expensifyCard/DynamicWorkspaceExpensifyCardDetailsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/expensifyCard/DynamicWorkspaceExpensifyCardDetailsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/expensifyCard/DynamicWorkspaceSettlementAccountPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/expensifyCard/issueNew/CardTypeStep.tsx" "@typescript-eslint/no-deprecated/MenuItem" 2 "../../src/pages/workspace/expensifyCard/issueNew/LimitTypeStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/expensifyCard/issueNew/spendRules/SetSpendRulesStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/expensifyCard/issueNew/spendRules/SpendRuleSelectionPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/expensifyCard/issueNew/spendRules/SpendRuleSelectionPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/expensifyCard/WorkspaceCardSettingsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/expensifyCard/WorkspaceExpensifyCardAddWorkEmailPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/expensifyCard/WorkspaceExpensifyCardBankAccounts.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 @@ -1644,6 +1831,7 @@ "../../src/pages/workspace/fields/FieldsAddListValuePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/fields/FieldsEditValuePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/fields/FieldsInitialListValuePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/fields/FieldsInitialListValuePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/fields/FieldsInitialValuePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/fields/FieldsListValuesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/fields/FieldsSettingsPage.tsx" "no-restricted-imports" 1 @@ -1668,17 +1856,21 @@ "../../src/pages/workspace/members/ImportedMembersConfirmationPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/members/ImportedMembersConfirmationPage.tsx" "react-hooks/refs" 7 "../../src/pages/workspace/members/ImportedMembersPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/members/ImportedMembersPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/members/ImportMembersPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/members/ImportMembersPage.tsx" "no-restricted-syntax" 1 "../../src/pages/workspace/members/ImportMembersPage.tsx" "rulesdir/no-default-id-values" 1 "../../src/pages/workspace/members/WorkspaceInviteMessageComponent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/members/WorkspaceInviteMessageComponent.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/members/WorkspaceInviteMessageComponent.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/workspace/members/WorkspaceInviteMessageComponent.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/members/WorkspaceMemberCustomFieldPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 2 "../../src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/members/WorkspaceMemberDisplayNamePage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/workspace/members/WorkspaceMembersRolePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/members/WorkspaceOwnerChangeCheck.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/members/WorkspaceOwnerPaymentCardForm.tsx" "react-hooks/set-state-in-effect" 2 "../../src/pages/workspace/merge/MergeConnectionsPageBase.tsx" "no-restricted-imports" 1 @@ -1690,6 +1882,7 @@ "../../src/pages/workspace/perDiem/EditPerDiemDestinationPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/perDiem/EditPerDiemSubratePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/perDiem/ImportedPerDiemPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/perDiem/ImportedPerDiemPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/perDiem/WorkspacePerDiemDetailsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/perDiem/WorkspacePerDiemPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/perDiem/WorkspacePerDiemSettingsPage.tsx" "no-restricted-imports" 1 @@ -1709,23 +1902,31 @@ "../../src/pages/workspace/rules/ExpenseReportRulesSection.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 3 "../../src/pages/workspace/rules/FlagForReviewRules/FlagForReviewRulePageBase.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/rules/IndividualExpenseRulesSectionRevamp.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 +"../../src/pages/workspace/rules/MerchantRules/AddMerchantRulePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/rules/MerchantRules/ExpenseDefaultTypePage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 +"../../src/pages/workspace/rules/MerchantRules/ImportedMerchantRulesPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/rules/MerchantRules/MerchantRulePageBase.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 +"../../src/pages/workspace/rules/MerchantRules/MerchantRulePageBase.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/rules/MerchantTypeRules/MerchantTypeRulePageBase.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/rules/RulesNewPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/workspace/rules/SpendRules/SpendRulePageBase.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/tags/DynamicEditTagPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/tags/DynamicTagApproverPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/tags/DynamicTagGLCodePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/tags/DynamicTagGLCodePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/tags/DynamicTagSettingsPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/tags/DynamicTagSettingsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/tags/DynamicWorkspaceEditTagsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/tags/DynamicWorkspaceViewTagsPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/tags/DynamicWorkspaceViewTagsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/tags/ImportedMultiLevelTagsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/tags/ImportedMultiLevelTagsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/tags/ImportedTagsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/tags/ImportedTagsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/tags/ImportMultiLevelTagsSettingsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/tags/ImportMultiLevelTagsSettingsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/tags/ImportTagsOptionsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/tags/ImportTagsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/tags/WorkspaceCreateTagPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/tags/WorkspaceTagsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/workspace/tags/WorkspaceTagsPage.tsx" "no-restricted-imports" 1 @@ -1743,6 +1944,7 @@ "../../src/pages/workspace/taxes/WorkspaceTaxesSettingsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/taxes/WorkspaceTaxesSettingsWorkspaceCurrency.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/timeTracking/WorkspaceTimeTrackingDefaultRatePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/timeTracking/WorkspaceTimeTrackingDefaultRatePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/travel/PolicyTravelPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/travel/WorkspaceTravelBillingExportPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/travel/WorkspaceTravelBillingFeedSelectorPage.tsx" "no-restricted-imports" 1 @@ -1755,13 +1957,18 @@ "../../src/pages/workspace/upgrade/WorkspaceUpgradePage.tsx" "no-restricted-imports" 2 "../../src/pages/workspace/vendors/WorkspaceVendorsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/withPolicy.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/pages/workspace/withPolicy.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/withPolicyAndFullscreenLoading.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/withPolicyConnections.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/workflows/approvals/ApprovalWorkflowEditor.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 2 +"../../src/pages/workspace/workflows/approvals/DynamicWorkspaceWorkflowsApprovalsExpensesFromPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApprovalLimitPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 2 "../../src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApprovalLimitPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsCreatePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsEditPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsEditPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/workflows/tabs/WorkflowsPaymentsTab.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/workspace/workflows/tabs/WorkflowsPaymentsTab.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/workflows/WorkspaceAutoReportingFrequencyPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -1771,8 +1978,10 @@ "../../src/pages/workspace/workflows/WorkspaceWorkflowsCurrencyConversionFeesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/workflows/WorkspaceWorkflowsPayerPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/WorkspaceConfirmationOwnerSelectorPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/WorkspaceConfirmationOwnerSelectorPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/WorkspaceConfirmationSuccessPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/WorkspaceInitialPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/WorkspaceJoinUserPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/WorkspaceMembersPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/WorkspaceMoreFeaturesPage/index.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/WorkspaceNamePage.tsx" "no-restricted-imports" 1 From 0acba0cdc0f015186bec93e5d6f20087947b6bec Mon Sep 17 00:00:00 2001 From: VickyStash Date: Thu, 22 Oct 2026 15:25:07 +0200 Subject: [PATCH 3/9] Update seatbelt after merging main --- config/eslint/eslint.seatbelt.tsv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/eslint/eslint.seatbelt.tsv b/config/eslint/eslint.seatbelt.tsv index 97b7cc0e0bbe..0948877d1a47 100644 --- a/config/eslint/eslint.seatbelt.tsv +++ b/config/eslint/eslint.seatbelt.tsv @@ -583,7 +583,6 @@ "../../src/hooks/useSidebarOrderedReports.tsx" "react-hooks/refs" 5 "../../src/hooks/useSidebarOrderedReports.tsx" "react-hooks/set-state-in-effect" 1 "../../src/hooks/useSingleExecution/index.native.ts" "react-hooks/refs" 1 -"../../src/hooks/useSingleExpenseReportView.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useStableIndexedHandler.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useStepFormSubmit.ts" "no-restricted-syntax" 1 "../../src/hooks/useSubPage/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 @@ -1870,6 +1869,8 @@ "../../src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/members/WorkspaceMemberDisplayNamePage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/workspace/members/WorkspaceMembersChangeOfficeLocationPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/workspace/members/WorkspaceMembersChangeWorkArrangementPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/members/WorkspaceMembersRolePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/members/WorkspaceOwnerChangeCheck.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/members/WorkspaceOwnerPaymentCardForm.tsx" "react-hooks/set-state-in-effect" 2 From 4ab6185ed683d6e54dc63e3c0435f8ce6925d9e8 Mon Sep 17 00:00:00 2001 From: VickyStash Date: Thu, 22 Oct 2026 16:01:00 +0200 Subject: [PATCH 4/9] Check aliased useOnyx imports in no-onyx-loading-status --- .../no-onyx-loading-status.js | 20 ++++++++++++++++--- tests/unit/NoOnyxLoadingStatusRuleTest.ts | 10 ++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/eslint-plugin-local-rules/no-onyx-loading-status.js b/eslint-plugin-local-rules/no-onyx-loading-status.js index ae7596f99061..b62ac91f45be 100644 --- a/eslint-plugin-local-rules/no-onyx-loading-status.js +++ b/eslint-plugin-local-rules/no-onyx-loading-status.js @@ -17,6 +17,7 @@ const meta = { }; const USE_ONYX_IDENTIFIER = 'useOnyx'; +const USE_ONYX_HOOK_PATH_SUFFIX = 'hooks/useOnyx'; const STATUS_PROPERTY = 'status'; const IS_LOADING_ONYX_VALUE_PATH_SUFFIX = 'types/utils/isLoadingOnyxValue'; @@ -54,6 +55,9 @@ function findStatusProperty(pattern) { * @returns {import('eslint').Rule.RuleListener} */ function create(context) { + // Local names `useOnyx` is called by in this file, so aliased imports like `{useOnyx as useOnyxWithoutSnapshots}` are checked too + const useOnyxNames = new Set([USE_ONYX_IDENTIFIER]); + /** * Reports `metadata.status`, `metadata?.status` and `const {status} = metadata` for a variable holding `useOnyx` result metadata. * @@ -78,10 +82,20 @@ function create(context) { return { ImportDeclaration(node) { - if (node.importKind === 'type' || typeof node.source.value !== 'string' || !node.source.value.endsWith(IS_LOADING_ONYX_VALUE_PATH_SUFFIX)) { + if (node.importKind === 'type' || typeof node.source.value !== 'string') { return; } - context.report({node, messageId: 'isLoadingOnyxValueImport'}); + const source = node.source.value; + for (const specifier of node.specifiers) { + const isNamedUseOnyx = specifier.type === 'ImportSpecifier' && specifier.imported.type === 'Identifier' && specifier.imported.name === USE_ONYX_IDENTIFIER; + const isDefaultUseOnyxHook = specifier.type === 'ImportDefaultSpecifier' && source.endsWith(USE_ONYX_HOOK_PATH_SUFFIX); + if (isNamedUseOnyx || isDefaultUseOnyxHook) { + useOnyxNames.add(specifier.local.name); + } + } + if (source.endsWith(IS_LOADING_ONYX_VALUE_PATH_SUFFIX)) { + context.report({node, messageId: 'isLoadingOnyxValueImport'}); + } }, VariableDeclarator(node) { @@ -89,7 +103,7 @@ function create(context) { return; } const callee = node.init.callee; - if (callee.type !== 'Identifier' || callee.name !== USE_ONYX_IDENTIFIER) { + if (callee.type !== 'Identifier' || !useOnyxNames.has(callee.name)) { return; } const metadataPattern = node.id.elements.at(1); diff --git a/tests/unit/NoOnyxLoadingStatusRuleTest.ts b/tests/unit/NoOnyxLoadingStatusRuleTest.ts index bb72057292fe..74d897beb0b4 100644 --- a/tests/unit/NoOnyxLoadingStatusRuleTest.ts +++ b/tests/unit/NoOnyxLoadingStatusRuleTest.ts @@ -44,11 +44,9 @@ describe('no-onyx-loading-status', () => { 'const [session] = useOnyx(ONYXKEYS.SESSION);', 'const [session, sessionMetadata] = useOnyx(ONYXKEYS.SESSION); doSomething(sessionMetadata);', 'const [session, {sourceValue}] = useOnyx(ONYXKEYS.SESSION);', - // Not a useOnyx result, e.g. Promise.allSettled results or API responses. "const results = await Promise.allSettled(promises); const isFulfilled = results[0].status === 'fulfilled';", "const [first, second] = useSomethingElse(); const isLoaded = second.status === 'loaded';", 'const response = await fetch(url); const isOk = response.status === 200;', - // A type-only import does not read the status. "import type isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';", "import useOnyx from '@hooks/useOnyx';", ], @@ -61,6 +59,14 @@ describe('no-onyx-loading-status', () => { code: "import isLoadingOnyxValue from './types/utils/isLoadingOnyxValue';", errors: [{messageId: 'isLoadingOnyxValueImport'}], }, + { + code: "import {useOnyx as useOnyxWithoutSnapshots} from 'react-native-onyx'; const [policies, policiesMetadata] = useOnyxWithoutSnapshots(ONYXKEYS.COLLECTION.POLICY); const isLoading = policiesMetadata.status === 'loading';", + errors: [{messageId: 'statusRead'}], + }, + { + code: "import useOnyxValue from '@hooks/useOnyx'; const [session, {status}] = useOnyxValue(ONYXKEYS.SESSION);", + errors: [{messageId: 'statusRead'}], + }, { code: "const [session, sessionMetadata] = useOnyx(ONYXKEYS.SESSION); const isLoading = sessionMetadata.status === 'loading';", errors: [{messageId: 'statusRead'}], From df2f8b21d2d8338aa094b517dabd19616914d98c Mon Sep 17 00:00:00 2001 From: VickyStash Date: Fri, 23 Oct 2026 11:04:28 +0200 Subject: [PATCH 5/9] Report each isLoadingOnyxValue call instead of each import --- config/eslint/eslint.seatbelt.tsv | 38 +++++++++---------- .../no-onyx-loading-status.js | 13 +++++-- tests/unit/NoOnyxLoadingStatusRuleTest.ts | 10 ++--- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/config/eslint/eslint.seatbelt.tsv b/config/eslint/eslint.seatbelt.tsv index 0948877d1a47..bb265d9dae01 100644 --- a/config/eslint/eslint.seatbelt.tsv +++ b/config/eslint/eslint.seatbelt.tsv @@ -293,8 +293,8 @@ "../../src/components/PressableWithSecondaryInteraction/index.native.tsx" "no-restricted-syntax" 1 "../../src/components/PressableWithSecondaryInteraction/index.tsx" "no-restricted-syntax" 1 "../../src/components/PriorityModeController.tsx" "rulesdir/no-onyx-loading-status" 1 -"../../src/components/ProductMarketingWindow/ProductMarketingWindowManager.tsx" "rulesdir/no-onyx-loading-status" 1 -"../../src/components/ProductTrainingContext/index.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/components/ProductMarketingWindow/ProductMarketingWindowManager.tsx" "rulesdir/no-onyx-loading-status" 2 +"../../src/components/ProductTrainingContext/index.tsx" "rulesdir/no-onyx-loading-status" 4 "../../src/components/PromotedActionsBar.tsx" "no-restricted-imports" 1 "../../src/components/PushRowWithModal/index.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/components/PushRowWithModal/PushRowModal.tsx" "no-restricted-imports" 1 @@ -419,7 +419,7 @@ "../../src/components/Table/Table.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/components/Table/TableContext.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/components/Tables/WorkspaceCategoryRulesTable/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 -"../../src/components/Tables/WorkspaceCompanyCardsTable/index.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/components/Tables/WorkspaceCompanyCardsTable/index.tsx" "rulesdir/no-onyx-loading-status" 3 "../../src/components/Tables/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableRow.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Tables/WorkspaceListTable/LeaveWorkspaceFlow.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/Tables/WorkspaceListTable/TransferOwnershipFlow.tsx" "rulesdir/no-onyx-loading-status" 1 @@ -527,7 +527,7 @@ "../../src/hooks/useHasReportAwaitingApproval.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useHydrateReportsFromSnapshot.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useImportSpreadsheetConfirmModal.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 -"../../src/hooks/useInFlightRequests.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useInFlightRequests.ts" "rulesdir/no-onyx-loading-status" 2 "../../src/hooks/useInitial.ts" "react-hooks/refs" 4 "../../src/hooks/useInitialOnyxValue.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useInitialSelection.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -535,7 +535,7 @@ "../../src/hooks/useIsBlockedToAddFeed.ts" "react-hooks/set-state-in-effect" 1 "../../src/hooks/useIsBlockedToAddFeed.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useIsDomainUsingCard.ts" "rulesdir/no-onyx-loading-status" 1 -"../../src/hooks/useIsLoadingAppRecovery.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useIsLoadingAppRecovery.ts" "rulesdir/no-onyx-loading-status" 2 "../../src/hooks/useIsOwnWorkspaceChatRef.ts" "react-hooks/refs" 2 "../../src/hooks/useIsPaidPolicyAdmin.ts" "no-restricted-imports" 1 "../../src/hooks/useKeyboardShortcut.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -545,7 +545,7 @@ "../../src/hooks/useMarkdownStyle.ts" "rulesdir/no-raw-typography" 3 "../../src/hooks/useMergeResultConfirmationConfig.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useNewTransactions.ts" "react-hooks/refs" 2 -"../../src/hooks/useOnboardingFlow.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useOnboardingFlow.ts" "rulesdir/no-onyx-loading-status" 3 "../../src/hooks/useOnyx.ts" "@typescript-eslint/no-unsafe-type-assertion" 10 "../../src/hooks/useOptimisticDraftTransactions.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useOtherFeedsForFeedSelector.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -566,7 +566,7 @@ "../../src/hooks/useResetBankAccountModal.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useResponsiveLayout/index.native.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useResponsiveLayout/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 -"../../src/hooks/useRestartOnOdometerImagesFailure/index.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useRestartOnOdometerImagesFailure/index.ts" "rulesdir/no-onyx-loading-status" 3 "../../src/hooks/useRestartOnReceiptFailure.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useRestoreWorkspacesTabOnNavigate.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useReviewDuplicatesNavigation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -591,7 +591,7 @@ "../../src/hooks/useTodoCounts.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useTodoSearchResults.ts" "rulesdir/no-onyx-loading-status" 2 "../../src/hooks/useTransactionViolationOfWorkspace.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 -"../../src/hooks/useTrialPaymentReminder.ts" "rulesdir/no-onyx-loading-status" 1 +"../../src/hooks/useTrialPaymentReminder.ts" "rulesdir/no-onyx-loading-status" 3 "../../src/hooks/useUserSecurityGroup.ts" "rulesdir/no-onyx-loading-status" 1 "../../src/hooks/useViolations.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/hooks/useWorkletStateMachine/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1138,7 +1138,7 @@ "../../src/pages/iou/request/DistanceRequestStartPage.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/DistanceRequestStartPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/iou/request/IOURequestStartPage.tsx" "no-restricted-imports" 1 -"../../src/pages/iou/request/IOURequestStartPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/iou/request/IOURequestStartPage.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/iou/request/ParticipantSearchResults.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/pages/iou/request/step/DistanceManualTabContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/DynamicIOURequestEditReport.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1241,7 +1241,7 @@ "../../src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx" "no-restricted-imports" 1 "../../src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx" "react-hooks/refs" 3 "../../src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx" "react-hooks/set-state-in-effect" 4 -"../../src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx" "rulesdir/no-onyx-loading-status" 4 "../../src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/USD/BeneficialOwnerInfo/subSteps/BeneficialOwnerDetailsFormSubSteps/LegalNameUBO.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/AddressBusiness.tsx" "rulesdir/no-onyx-loading-status" 1 @@ -1305,7 +1305,7 @@ "../../src/pages/settings/AboutPage/AboutPage.tsx" "react-hooks/refs" 1 "../../src/pages/settings/Agents/AgentsPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Agents/DynamicAddAgentPage.tsx" "no-restricted-imports" 1 -"../../src/pages/settings/Agents/DynamicAddAgentPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/settings/Agents/DynamicAddAgentPage.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/settings/Agents/DynamicEditAgentPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Agents/DynamicEditAgentPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Agents/DynamicNewAgentPage.tsx" "no-restricted-imports" 1 @@ -1399,7 +1399,7 @@ "../../src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthWrapper.tsx" "no-restricted-imports" 1 "../../src/pages/settings/SettingsMenuItem.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/settings/Subscription/CancelSubscriptionPage/index.tsx" "no-restricted-imports" 1 -"../../src/pages/settings/Subscription/CancelSubscriptionPage/index.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/settings/Subscription/CancelSubscriptionPage/index.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/settings/Subscription/CardSection/CardSection.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/settings/Subscription/DisableAutoRenewSurveyPage/index.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Subscription/EarlyRenewalOfferPage/index.web.tsx" "rulesdir/no-onyx-loading-status" 1 @@ -1454,7 +1454,7 @@ "../../src/pages/settings/Wallet/InternationalDepositAccount/utils.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/PaymentMethodList.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/settings/Wallet/PaymentMethodList.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 -"../../src/pages/settings/Wallet/PaymentMethodList.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/settings/Wallet/PaymentMethodList.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/settings/Wallet/PaymentMethodListItem.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1 "../../src/pages/settings/Wallet/PersonalCardDetailsHeaderMenu.tsx" "@typescript-eslint/no-deprecated/MenuItem" 2 "../../src/pages/settings/Wallet/PersonalCardDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -1488,7 +1488,7 @@ "../../src/pages/settings/Wallet/TransferBalancePage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 2 "../../src/pages/settings/Wallet/TransferBalancePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/TravelCVVPage/TravelCVVPage.tsx" "no-restricted-imports" 1 -"../../src/pages/settings/Wallet/TravelCVVPage/TravelCVVPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/settings/Wallet/TravelCVVPage/TravelCVVPage.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/settings/Wallet/UnshareBankAccount/UnshareBankAccount.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/UpdatePersonalBankAccountPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Wallet/UpdatePersonalBankAccountPage.tsx" "no-restricted-imports" 1 @@ -1568,7 +1568,7 @@ "../../src/pages/Travel/DynamicTripSummaryPage.tsx" "no-restricted-imports" 1 "../../src/pages/Travel/DynamicWorkspaceConfirmationForTravelPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/Travel/EnableTravel/EnableTravelContent.tsx" "no-restricted-imports" 1 -"../../src/pages/Travel/EnableTravel/index.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/Travel/EnableTravel/index.tsx" "rulesdir/no-onyx-loading-status" 3 "../../src/pages/Travel/HotelTripDetails.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 3 "../../src/pages/Travel/MyTripsPage.tsx" "no-restricted-imports" 1 "../../src/pages/Travel/TravelDotLinkWebview.tsx" "no-restricted-imports" 1 @@ -1726,7 +1726,7 @@ "../../src/pages/workspace/companyCards/addNew/CardTypeStep.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/addNew/CompanyCardLayoutNamePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/addNew/CompanyCardsImportedPage.tsx" "no-restricted-imports" 1 -"../../src/pages/workspace/companyCards/addNew/CompanyCardsImportedPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/workspace/companyCards/addNew/CompanyCardsImportedPage.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/workspace/companyCards/addNew/DetailsStep.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/addNew/DynamicAddNewCardPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/addNew/ImportFromFileStep.tsx" "no-restricted-imports" 1 @@ -1744,7 +1744,7 @@ "../../src/pages/workspace/companyCards/DynamicWorkspaceCompanyCardDetailsPage.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/companyCards/DynamicWorkspaceCompanyCardDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/companyCards/DynamicWorkspaceCompanyCardDetailsPage.tsx" "no-restricted-imports" 1 -"../../src/pages/workspace/companyCards/DynamicWorkspaceCompanyCardDetailsPage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/workspace/companyCards/DynamicWorkspaceCompanyCardDetailsPage.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardAddWorkEmailPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardAddWorkEmailPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardEditCardNamePage.tsx" "no-restricted-imports" 1 @@ -1756,10 +1756,10 @@ "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsErrorConfirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx" "no-restricted-imports" 1 -"../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx" "no-restricted-imports" 1 -"../../src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx" "rulesdir/no-onyx-loading-status" 2 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/WorkspaceVerifyWorkAccountPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 diff --git a/eslint-plugin-local-rules/no-onyx-loading-status.js b/eslint-plugin-local-rules/no-onyx-loading-status.js index b62ac91f45be..53fee3b4ef11 100644 --- a/eslint-plugin-local-rules/no-onyx-loading-status.js +++ b/eslint-plugin-local-rules/no-onyx-loading-status.js @@ -9,7 +9,7 @@ const meta = { }, schema: [], messages: { - isLoadingOnyxValueImport: + isLoadingOnyxValueUsage: 'Do not use `isLoadingOnyxValue`. Onyx is removing per-key loading status from `useOnyx`, so after startup this will always return `false`. Read the value directly and treat `undefined` as no data (https://github.com/Expensify/App/issues/104583).', statusRead: 'Do not read `status` from a `useOnyx` result. Onyx is removing per-key loading status, so after startup it will always be `loaded`. Read the value directly and treat `undefined` as no data (https://github.com/Expensify/App/issues/104583).', @@ -82,7 +82,7 @@ function create(context) { return { ImportDeclaration(node) { - if (node.importKind === 'type' || typeof node.source.value !== 'string') { + if (typeof node.source.value !== 'string') { return; } const source = node.source.value; @@ -93,8 +93,13 @@ function create(context) { useOnyxNames.add(specifier.local.name); } } - if (source.endsWith(IS_LOADING_ONYX_VALUE_PATH_SUFFIX)) { - context.report({node, messageId: 'isLoadingOnyxValueImport'}); + if (!source.endsWith(IS_LOADING_ONYX_VALUE_PATH_SUFFIX)) { + return; + } + for (const variable of context.sourceCode.getDeclaredVariables(node)) { + for (const reference of variable.references) { + context.report({node: reference.identifier, messageId: 'isLoadingOnyxValueUsage'}); + } } }, diff --git a/tests/unit/NoOnyxLoadingStatusRuleTest.ts b/tests/unit/NoOnyxLoadingStatusRuleTest.ts index 74d897beb0b4..b574b7210104 100644 --- a/tests/unit/NoOnyxLoadingStatusRuleTest.ts +++ b/tests/unit/NoOnyxLoadingStatusRuleTest.ts @@ -47,17 +47,15 @@ describe('no-onyx-loading-status', () => { "const results = await Promise.allSettled(promises); const isFulfilled = results[0].status === 'fulfilled';", "const [first, second] = useSomethingElse(); const isLoaded = second.status === 'loaded';", 'const response = await fetch(url); const isOk = response.status === 200;', - "import type isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';", - "import useOnyx from '@hooks/useOnyx';", ], invalid: [ { - code: "import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';", - errors: [{messageId: 'isLoadingOnyxValueImport'}], + code: "import isLoadingOnyxValue from './types/utils/isLoadingOnyxValue'; const isLoading = isLoadingOnyxValue(sessionMetadata);", + errors: [{messageId: 'isLoadingOnyxValueUsage'}], }, { - code: "import isLoadingOnyxValue from './types/utils/isLoadingOnyxValue';", - errors: [{messageId: 'isLoadingOnyxValueImport'}], + code: "import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue'; const a = isLoadingOnyxValue(sessionMetadata); const b = isLoadingOnyxValue(policyMetadata, reportMetadata);", + errors: [{messageId: 'isLoadingOnyxValueUsage'}, {messageId: 'isLoadingOnyxValueUsage'}], }, { code: "import {useOnyx as useOnyxWithoutSnapshots} from 'react-native-onyx'; const [policies, policiesMetadata] = useOnyxWithoutSnapshots(ONYXKEYS.COLLECTION.POLICY); const isLoading = policiesMetadata.status === 'loading';", From a37544f8982c17d824116f4733b1ed469ce07e83 Mon Sep 17 00:00:00 2001 From: VickyStash Date: Fri, 23 Oct 2026 11:20:35 +0200 Subject: [PATCH 6/9] Reword no-onyx-loading-status messages --- eslint-plugin-local-rules/no-onyx-loading-status.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/eslint-plugin-local-rules/no-onyx-loading-status.js b/eslint-plugin-local-rules/no-onyx-loading-status.js index 53fee3b4ef11..3b48be4506ec 100644 --- a/eslint-plugin-local-rules/no-onyx-loading-status.js +++ b/eslint-plugin-local-rules/no-onyx-loading-status.js @@ -3,16 +3,15 @@ const name = 'no-onyx-loading-status'; const meta = { type: 'problem', docs: { - description: - 'Disallow `isLoadingOnyxValue` and reads of `status` from `useOnyx` results. Onyx is removing per-key loading status, so after `Onyx.init` finishes the status will always be `loaded`.', + description: 'Disallow `isLoadingOnyxValue` and reads of `status` from `useOnyx` results, because Onyx is dropping per-key loading status.', recommended: 'error', }, schema: [], messages: { isLoadingOnyxValueUsage: - 'Do not use `isLoadingOnyxValue`. Onyx is removing per-key loading status from `useOnyx`, so after startup this will always return `false`. Read the value directly and treat `undefined` as no data (https://github.com/Expensify/App/issues/104583).', + 'Do not use `isLoadingOnyxValue`. Onyx is dropping per-key loading status from `useOnyx`. Read the value directly and treat `undefined` as no data (https://github.com/Expensify/App/issues/104583).', statusRead: - 'Do not read `status` from a `useOnyx` result. Onyx is removing per-key loading status, so after startup it will always be `loaded`. Read the value directly and treat `undefined` as no data (https://github.com/Expensify/App/issues/104583).', + 'Do not read `status` from a `useOnyx` result. Onyx is dropping per-key loading status. Read the value directly and treat `undefined` as no data (https://github.com/Expensify/App/issues/104583).', }, }; From d2741d180718cd642b38e4c65f18d465c27e4322 Mon Sep 17 00:00:00 2001 From: VickyStash Date: Fri, 23 Oct 2026 11:32:20 +0200 Subject: [PATCH 7/9] Update seatbelt after merging main --- config/eslint/eslint.seatbelt.tsv | 1 + 1 file changed, 1 insertion(+) diff --git a/config/eslint/eslint.seatbelt.tsv b/config/eslint/eslint.seatbelt.tsv index aa4330877b66..91e20e6ea58d 100644 --- a/config/eslint/eslint.seatbelt.tsv +++ b/config/eslint/eslint.seatbelt.tsv @@ -1116,6 +1116,7 @@ "../../src/pages/inbox/sidebar/FABPopoverContent/menuItems/NewWorkspaceMenuItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/inbox/sidebar/FABPopoverContent/menuItems/TravelMenuItem.tsx" "no-restricted-imports" 1 "../../src/pages/inbox/sidebar/FABPopoverContent/useScanActions.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/Insights/InsightsDashboard.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/Insights/useInsightsFilters.ts" "rulesdir/no-onyx-loading-status" 3 "../../src/pages/iou/DynamicSplitBillDetailsPage.tsx" "no-restricted-imports" 1 "../../src/pages/iou/DynamicSplitExpenseCreateDateRangePage.tsx" "no-restricted-imports" 1 From b4803867b4cb6e86031979cd9f30e27d4f40d876 Mon Sep 17 00:00:00 2001 From: VickyStash Date: Mon, 26 Oct 2026 08:14:08 +0100 Subject: [PATCH 8/9] Update seatbelt after merging main --- config/eslint/eslint.seatbelt.tsv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/eslint/eslint.seatbelt.tsv b/config/eslint/eslint.seatbelt.tsv index 4a6a8404cf42..6abe07ce5691 100644 --- a/config/eslint/eslint.seatbelt.tsv +++ b/config/eslint/eslint.seatbelt.tsv @@ -86,6 +86,7 @@ "../../src/components/BaseVacationDelegateSelectionComponent.tsx" "no-restricted-imports" 1 "../../src/components/BlockingViews/FullPageNotFoundView.tsx" "no-restricted-imports" 1 "../../src/components/BookTravelButton.tsx" "no-restricted-imports" 1 +"../../src/components/BulkActionStatusManager.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/components/ButtonWithDropdownMenu/index.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/CategoryPicker/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Charts/hooks/useChartLabelFormats.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1724,6 +1725,7 @@ "../../src/pages/workspace/companyCards/WorkspaceCompanyCardEditCardNamePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/companyCards/WorkspaceCompanyCardsBulkEditTransactionStartDatePage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsErrorConfirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx" "no-restricted-imports" 1 From 88cb488460b8f72bbb1ef80d61a00505e34d2e78 Mon Sep 17 00:00:00 2001 From: VickyStash Date: Wed, 28 Oct 2026 09:05:44 +0100 Subject: [PATCH 9/9] Update seatbelt after merging main --- config/eslint/eslint.seatbelt.tsv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/eslint/eslint.seatbelt.tsv b/config/eslint/eslint.seatbelt.tsv index 7c1378e1c467..06082dd24d82 100644 --- a/config/eslint/eslint.seatbelt.tsv +++ b/config/eslint/eslint.seatbelt.tsv @@ -789,6 +789,7 @@ "../../src/libs/Navigation/AppNavigator/KeyboardShortcutsHandler/SearchHandler.tsx" "no-restricted-syntax" 1 "../../src/libs/Navigation/AppNavigator/KeyboardShortcutsHandler/ShortcutsOverviewHandler.tsx" "no-restricted-syntax" 1 "../../src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 5 +"../../src/libs/Navigation/AppNavigator/Navigators/NativeTabNavigator/TabPressListeners.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/libs/Navigation/AppNavigator/Navigators/OnboardingModalNavigator.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/libs/Navigation/AppNavigator/Navigators/Overlay/BaseOverlay.tsx" "no-restricted-syntax" 2 "../../src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1072,6 +1073,7 @@ "../../src/pages/inbox/sidebar/FABPopoverContent/menuItems/TravelMenuItem.tsx" "no-restricted-imports" 1 "../../src/pages/inbox/sidebar/FABPopoverContent/useScanActions.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/Insights/InsightsDashboard.tsx" "rulesdir/no-onyx-loading-status" 1 +"../../src/pages/Insights/InsightsPage.tsx" "rulesdir/no-onyx-loading-status" 1 "../../src/pages/Insights/useInsightsFilters.ts" "rulesdir/no-onyx-loading-status" 3 "../../src/pages/iou/DynamicSplitBillDetailsPage.tsx" "no-restricted-imports" 1 "../../src/pages/iou/DynamicSplitExpenseCreateDateRangePage.tsx" "no-restricted-imports" 1