From 9e661d9944cc2eeebc470de0263776f4992bd745 Mon Sep 17 00:00:00 2001 From: Jeesun Kim Date: Wed, 24 Jun 2026 11:02:35 -0700 Subject: [PATCH 1/7] chore(deps): add @tanstack/eslint-plugin-query and dedupe typescript-eslint Add @tanstack/eslint-plugin-query as a devDependency. It requires @typescript-eslint/utils ^8.58.1, which would otherwise pull a second @typescript-eslint tree (8.62) alongside the existing 8.43 used by eslint-config-next. Align the family on a single 8.62.0 version by bumping @typescript-eslint/eslint-plugin and adding a matching parser, so the lockfile resolves to one tree instead of two. Co-Authored-By: Claude Opus 4.8 (1M context) --- package.json | 4 +- pnpm-lock.yaml | 291 ++++++++++++++++++++++++++++++------------------- 2 files changed, 181 insertions(+), 114 deletions(-) diff --git a/package.json b/package.json index a8beab140..fedebbf56 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "devDependencies": { "@next/eslint-plugin-next": "^15.4.4", "@playwright/test": "^1.57.0", + "@tanstack/eslint-plugin-query": "^5.101.1", "@types/jest": "^30.0.0", "@types/json-schema": "^7.0.15", "@types/lodash": "^4.17.20", @@ -66,7 +67,8 @@ "@types/papaparse": "^5.3.15", "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", - "@typescript-eslint/eslint-plugin": "^8.30.1", + "@typescript-eslint/eslint-plugin": "^8.62.0", + "@typescript-eslint/parser": "^8.62.0", "eslint": "^9.32.0", "eslint-config-next": "15.4.4", "eslint-config-prettier": "^10.1.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e853b317..595f28c47 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,6 +125,9 @@ importers: '@playwright/test': specifier: ^1.57.0 version: 1.57.0 + '@tanstack/eslint-plugin-query': + specifier: ^5.101.1 + version: 5.101.1(eslint@9.35.0)(typescript@5.9.2) '@types/jest': specifier: ^30.0.0 version: 30.0.0 @@ -147,8 +150,11 @@ importers: specifier: ^19.1.7 version: 19.1.9(@types/react@19.1.12) '@typescript-eslint/eslint-plugin': - specifier: ^8.30.1 - version: 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2) + specifier: ^8.62.0 + version: 8.62.0(@typescript-eslint/parser@8.62.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/parser': + specifier: ^8.62.0 + version: 8.62.0(eslint@9.35.0)(typescript@5.9.2) eslint: specifier: ^9.32.0 version: 9.35.0 @@ -487,10 +493,20 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.21.0': resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2399,6 +2415,7 @@ packages: '@stellar/stellar-base@15.0.0': resolution: {integrity: sha512-XQhxUr9BYiEcFcgc4oWcCMR9QJCny/GmmGsuwPKf/ieIcOeb5149KLHYx9mJCA0ea8QbucR2/GzV58QbXOTxQA==} engines: {node: '>=20.0.0'} + deprecated: This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support. '@stellar/stellar-sdk@13.3.0': resolution: {integrity: sha512-8+GHcZLp+mdin8gSjcgfb/Lb6sSMYRX6Nf/0LcSJxvjLQR0XHpjGzOiRbYb2jSXo51EnA6kAV5j+4Pzh5OUKUg==} @@ -2422,6 +2439,15 @@ packages: '@swc/helpers@0.5.22': resolution: {integrity: sha512-/e2Ly3Docn9kYByap6TV4oquJ3wQuz3c+kC74riqtkwU9CwTMeuj6t2rW+bRr4pyOx/CYQM4wr0RgaKQwGEz0A==} + '@tanstack/eslint-plugin-query@5.101.1': + resolution: {integrity: sha512-gssErdsLIoeiJI6mbU1YTNlNxktj/Dt8r8QSXNxz8P4gBTnKl9xAPix84orbkIbd133ewAbqieRMZUQmxL+34w==} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ^5.4.0 || ^6.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@tanstack/query-core@5.87.4': resolution: {integrity: sha512-uNsg6zMxraEPDVO2Bn+F3/ctHi+Zsk+MMpcN8h6P7ozqD088F6mFY5TfGM7zuyIrL7HKpDyu6QHfLWiDxh3cuw==} @@ -2832,63 +2858,63 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.43.0': - resolution: {integrity: sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==} + '@typescript-eslint/eslint-plugin@8.62.0': + resolution: {integrity: sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.43.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser': ^8.62.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.43.0': - resolution: {integrity: sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==} + '@typescript-eslint/parser@8.62.0': + resolution: {integrity: sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.43.0': - resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==} + '@typescript-eslint/project-service@8.62.0': + resolution: {integrity: sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.43.0': - resolution: {integrity: sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==} + '@typescript-eslint/scope-manager@8.62.0': + resolution: {integrity: sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.43.0': - resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==} + '@typescript-eslint/tsconfig-utils@8.62.0': + resolution: {integrity: sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.43.0': - resolution: {integrity: sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==} + '@typescript-eslint/type-utils@8.62.0': + resolution: {integrity: sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.43.0': - resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} + '@typescript-eslint/types@8.62.0': + resolution: {integrity: sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.43.0': - resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==} + '@typescript-eslint/typescript-estree@8.62.0': + resolution: {integrity: sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.43.0': - resolution: {integrity: sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==} + '@typescript-eslint/utils@8.62.0': + resolution: {integrity: sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.43.0': - resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} + '@typescript-eslint/visitor-keys@8.62.0': + resolution: {integrity: sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -3388,6 +3414,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + bare-addon-resolve@1.9.4: resolution: {integrity: sha512-unn6Vy/Yke6F99vg/7tcrvM2KUvIhTNniaSqDbam4AWkd4NhvDVSrQiRYVlNzUV2P7SPobkCK7JFVxrJk9btCg==} peerDependencies: @@ -3501,6 +3531,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -3822,6 +3856,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -4143,6 +4186,10 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.35.0: resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4244,10 +4291,6 @@ packages: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -4433,9 +4476,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} @@ -5184,6 +5224,10 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -6244,8 +6288,8 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -7256,8 +7300,15 @@ snapshots: eslint: 9.35.0 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.1(eslint@9.35.0)': + dependencies: + eslint: 9.35.0 + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} + '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 @@ -9956,6 +10007,15 @@ snapshots: dependencies: tslib: 2.8.1 + '@tanstack/eslint-plugin-query@5.101.1(eslint@9.35.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/utils': 8.62.0(eslint@9.35.0)(typescript@5.9.2) + eslint: 9.35.0 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@tanstack/query-core@5.87.4': {} '@tanstack/query-devtools@5.87.3': {} @@ -10664,98 +10724,96 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.62.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.43.0 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.62.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.62.0 + '@typescript-eslint/type-utils': 8.62.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.62.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.62.0 eslint: 9.35.0 - graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) + ts-api-utils: 2.5.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2)': + '@typescript-eslint/parser@8.62.0(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.43.0 - debug: 4.4.1 + '@typescript-eslint/scope-manager': 8.62.0 + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.62.0 + debug: 4.4.3 eslint: 9.35.0 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.43.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.62.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - debug: 4.4.1 + '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@5.9.2) + '@typescript-eslint/types': 8.62.0 + debug: 4.4.3 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.43.0': + '@typescript-eslint/scope-manager@8.62.0': dependencies: - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/visitor-keys': 8.43.0 + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/visitor-keys': 8.62.0 - '@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.62.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0)(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.62.0(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - debug: 4.4.1 + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.62.0(eslint@9.35.0)(typescript@5.9.2) + debug: 4.4.3 eslint: 9.35.0 - ts-api-utils: 2.1.0(typescript@5.9.2) + ts-api-utils: 2.5.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.43.0': {} + '@typescript-eslint/types@8.62.0': {} - '@typescript-eslint/typescript-estree@8.43.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.62.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.43.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/visitor-keys': 8.43.0 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.4 - ts-api-utils: 2.1.0(typescript@5.9.2) + '@typescript-eslint/project-service': 8.62.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@5.9.2) + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/visitor-keys': 8.62.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.1 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.43.0(eslint@9.35.0)(typescript@5.9.2)': + '@typescript-eslint/utils@8.62.0(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.35.0) + '@typescript-eslint/scope-manager': 8.62.0 + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.2) eslint: 9.35.0 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.43.0': + '@typescript-eslint/visitor-keys@8.62.0': dependencies: - '@typescript-eslint/types': 8.43.0 - eslint-visitor-keys: 4.2.1 + '@typescript-eslint/types': 8.62.0 + eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.0': {} @@ -11717,6 +11775,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + bare-addon-resolve@1.9.4(bare-url@2.2.2): dependencies: bare-module-resolve: 1.11.1(bare-url@2.2.2) @@ -11819,6 +11879,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -12187,6 +12251,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decamelize@1.2.0: {} dedent@1.7.0: {} @@ -12457,12 +12525,12 @@ snapshots: dependencies: '@next/eslint-plugin-next': 15.4.4 '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2) - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.62.0(@typescript-eslint/parser@8.62.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.62.0(eslint@9.35.0)(typescript@5.9.2) eslint: 9.35.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.35.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.62.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.35.0) eslint-plugin-react: 7.37.5(eslint@9.35.0) eslint-plugin-react-hooks: 5.2.0(eslint@9.35.0) @@ -12496,22 +12564,22 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.62.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.62.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.62.0(eslint@9.35.0)(typescript@5.9.2) eslint: 9.35.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.35.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.62.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -12522,7 +12590,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.35.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.62.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -12534,7 +12602,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.62.0(eslint@9.35.0)(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -12599,6 +12667,8 @@ snapshots: eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.1: {} + eslint@9.35.0: dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) @@ -12736,14 +12806,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} @@ -12926,8 +12988,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - h3@1.15.11: dependencies: cookie-es: 1.2.3 @@ -13924,6 +13984,10 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -14700,7 +14764,8 @@ snapshots: semver@7.7.3: {} - semver@7.7.4: {} + semver@7.7.4: + optional: true semver@7.8.1: {} @@ -15110,7 +15175,7 @@ snapshots: tr46@0.0.3: {} - ts-api-utils@2.1.0(typescript@5.9.2): + ts-api-utils@2.5.0(typescript@5.9.2): dependencies: typescript: 5.9.2 From fefc3452e5bb031fefc4eae2f97ed4072bbb196d Mon Sep 17 00:00:00 2001 From: Jeesun Kim Date: Wed, 24 Jun 2026 11:02:45 -0700 Subject: [PATCH 2/7] fix(query): enable @tanstack/query rules and complete queryKeys Enable plugin:@tanstack/query/recommended in the ESLint config and fix the 19 exhaustive-deps violations it surfaces. Each affected hook read values in its queryFn (most commonly headers, plus url/passphrase/asset/count inputs) that were absent from its queryKey, so distinct inputs could collide on one cache entry and return stale data. Add the missing values to every queryKey. Co-Authored-By: Claude Opus 4.8 (1M context) --- .eslintrc.json | 1 + src/query/external/useSEContractStorage.ts | 7 ++++++- src/query/useAccountInfo.ts | 2 +- src/query/useAccountSequenceNumber.ts | 7 ++++++- src/query/useAddTrustline.ts | 10 +++++++++- src/query/useBuildRpcTransaction.ts | 9 ++++++++- src/query/useBuildVerification.ts | 2 +- src/query/useCheckTxSignatures.ts | 2 +- src/query/useEndpoint.ts | 2 +- src/query/useFetchRpcTxDetails.ts | 2 +- src/query/useFriendBot.ts | 9 ++++++++- src/query/useGetContractDataFromRpcById.ts | 9 ++++++++- src/query/useGetRpcTxDetails.ts | 2 +- src/query/useGetRpcTxs.ts | 2 +- src/query/useHorizonHealthCheckUntilReady.ts | 2 +- src/query/useLatestLedger.ts | 2 +- src/query/useLatestTxn.ts | 2 +- src/query/useRpcHealthCheckUntilReady.ts | 2 +- src/query/useWasmBinaryFromRpc.ts | 2 +- src/query/useWasmGitHubAttestation.ts | 2 +- 20 files changed, 59 insertions(+), 19 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index b2359795a..dd0b3054c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -3,6 +3,7 @@ "eslint:recommended", "plugin:@typescript-eslint/recommended", "next/core-web-vitals", + "plugin:@tanstack/query/recommended", "prettier" ], "rules": { diff --git a/src/query/external/useSEContractStorage.ts b/src/query/external/useSEContractStorage.ts index ce76f05a3..aa62655ec 100644 --- a/src/query/external/useSEContractStorage.ts +++ b/src/query/external/useSEContractStorage.ts @@ -21,7 +21,12 @@ export const useSEContractStorage = ({ totalEntriesCount: number | undefined; }) => { const query = useQuery({ - queryKey: ["useSEContractStorage", networkId, contractId], + queryKey: [ + "useSEContractStorage", + networkId, + contractId, + totalEntriesCount, + ], queryFn: async () => { // No entries if (!totalEntriesCount) { diff --git a/src/query/useAccountInfo.ts b/src/query/useAccountInfo.ts index 78640a747..0ee36f5a5 100644 --- a/src/query/useAccountInfo.ts +++ b/src/query/useAccountInfo.ts @@ -11,7 +11,7 @@ export const useAccountInfo = ({ headers: NetworkHeaders; }) => { const query = useQuery({ - queryKey: ["accountInfo", publicKey], + queryKey: ["accountInfo", publicKey, horizonUrl, headers], queryFn: async () => { try { const response = await fetch(`${horizonUrl}/accounts/${publicKey}`, { diff --git a/src/query/useAccountSequenceNumber.ts b/src/query/useAccountSequenceNumber.ts index 1feb8b3c7..ccdec0193 100644 --- a/src/query/useAccountSequenceNumber.ts +++ b/src/query/useAccountSequenceNumber.ts @@ -16,7 +16,12 @@ export const useAccountSequenceNumber = ({ enabled?: boolean; }) => { const query = useQuery({ - queryKey: ["accountSequenceNumber", { publicKey, uniqueId }], + queryKey: [ + "accountSequenceNumber", + { publicKey, uniqueId }, + horizonUrl, + headers, + ], queryFn: async () => { let sourceAccount = publicKey; diff --git a/src/query/useAddTrustline.ts b/src/query/useAddTrustline.ts index 8f75c0bf4..c31fc2f43 100644 --- a/src/query/useAddTrustline.ts +++ b/src/query/useAddTrustline.ts @@ -24,7 +24,15 @@ export const useAddTrustline = ({ headers: NetworkHeaders; }) => { const query = useQuery({ - queryKey: ["addTrustline", publicKey], + queryKey: [ + "addTrustline", + publicKey, + asset.assetCode, + asset.assetIssuer, + network.horizonUrl, + network.passphrase, + headers, + ], queryFn: async () => { if (!asset.assetCode || !asset.assetIssuer) { throw new Error("Asset code and issuer are required"); diff --git a/src/query/useBuildRpcTransaction.ts b/src/query/useBuildRpcTransaction.ts index 900cd0c4d..1895f7337 100644 --- a/src/query/useBuildRpcTransaction.ts +++ b/src/query/useBuildRpcTransaction.ts @@ -30,7 +30,14 @@ export const useBuildRpcTransaction = ({ timeoutInSeconds?: number; }) => { const query = useQuery({ - queryKey: ["buildRpcTransaction", publicKey, operation], + queryKey: [ + "buildRpcTransaction", + publicKey, + operation, + networkPassphrase, + timeoutInSeconds, + headers, + ], queryFn: async () => { if (!publicKey) { throw "Public key is required."; diff --git a/src/query/useBuildVerification.ts b/src/query/useBuildVerification.ts index 1f214f398..c87296da5 100644 --- a/src/query/useBuildVerification.ts +++ b/src/query/useBuildVerification.ts @@ -13,7 +13,7 @@ export const useBuildVerification = ({ }) => { const queries = useQueries({ queries: contractIds.map((contractId) => ({ - queryKey: ["buildVerification", contractId, rpcUrl], + queryKey: ["buildVerification", contractId, rpcUrl, headers], queryFn: () => getBuildVerification({ contractId, diff --git a/src/query/useCheckTxSignatures.ts b/src/query/useCheckTxSignatures.ts index 67fd627f1..1d50e6f88 100644 --- a/src/query/useCheckTxSignatures.ts +++ b/src/query/useCheckTxSignatures.ts @@ -14,7 +14,7 @@ export const useCheckTxSignatures = ({ headers: NetworkHeaders; }) => { const query = useQuery({ - queryKey: ["tx", "signatures"], + queryKey: ["tx", "signatures", xdr, networkPassphrase, networkUrl, headers], queryFn: async () => { try { return await fetchTxSignatures({ diff --git a/src/query/useEndpoint.ts b/src/query/useEndpoint.ts index 3eda33752..58852fa33 100644 --- a/src/query/useEndpoint.ts +++ b/src/query/useEndpoint.ts @@ -12,7 +12,7 @@ export const useEndpoint = ({ headers: NetworkHeaders; }) => { const query = useQuery({ - queryKey: ["endpoint", "response", postData], + queryKey: ["endpoint", "response", postData, requestUrl, headers], queryFn: async () => { const endpointResponse = await fetch(sanitizeUrl(requestUrl), { headers, diff --git a/src/query/useFetchRpcTxDetails.ts b/src/query/useFetchRpcTxDetails.ts index 422dc6c38..6dbf97731 100644 --- a/src/query/useFetchRpcTxDetails.ts +++ b/src/query/useFetchRpcTxDetails.ts @@ -11,7 +11,7 @@ export const useFetchRpcTxDetails = ({ txHash: string; }) => { const query = useQuery({ - queryKey: ["useFetchRpcTxDetails", rpcUrl, txHash], + queryKey: ["useFetchRpcTxDetails", rpcUrl, txHash, headers], queryFn: async () => { try { const response = await fetch(rpcUrl, { diff --git a/src/query/useFriendBot.ts b/src/query/useFriendBot.ts index 2658100e8..a4aec6050 100644 --- a/src/query/useFriendBot.ts +++ b/src/query/useFriendBot.ts @@ -20,7 +20,14 @@ export const useFriendBot = ({ : "https://friendbot.stellar.org"; const query = useQuery({ - queryKey: ["friendBot", publicKey, key], + queryKey: [ + "friendBot", + publicKey, + key, + network, + knownFriendbotURL, + headers, + ], queryFn: async () => { if (!network.horizonUrl) { throw new Error(`Please use a network that supports Horizon`); diff --git a/src/query/useGetContractDataFromRpcById.ts b/src/query/useGetContractDataFromRpcById.ts index 044cbe198..3d8878837 100644 --- a/src/query/useGetContractDataFromRpcById.ts +++ b/src/query/useGetContractDataFromRpcById.ts @@ -24,7 +24,14 @@ export const useGetContractDataFromRpcById = ({ | null | undefined >({ - queryKey: ["useGetContractDataFromRpcById", contractId, rpcUrl], + queryKey: [ + "useGetContractDataFromRpcById", + contractId, + rpcUrl, + execWasmType, + execStellarAssetType, + headers, + ], queryFn: async () => { if (!contractId || !rpcUrl) { return null; diff --git a/src/query/useGetRpcTxDetails.ts b/src/query/useGetRpcTxDetails.ts index 9f90789a1..54f8679ec 100644 --- a/src/query/useGetRpcTxDetails.ts +++ b/src/query/useGetRpcTxDetails.ts @@ -13,7 +13,7 @@ export const useGetRpcTxDetails = ({ tx: string; }) => { const query = useQuery({ - queryKey: ["useGetRpcTxDetails", rpcUrl, tx], + queryKey: ["useGetRpcTxDetails", rpcUrl, tx, headers], queryFn: async () => { const rpcServer = new StellarRpc.Server(rpcUrl, { headers, diff --git a/src/query/useGetRpcTxs.ts b/src/query/useGetRpcTxs.ts index b0a2f241f..d44b34083 100644 --- a/src/query/useGetRpcTxs.ts +++ b/src/query/useGetRpcTxs.ts @@ -13,7 +13,7 @@ export const useGetRpcTxs = ({ startLedger: number; }) => { const query = useQuery({ - queryKey: ["useGetRpcTxs", rpcUrl, startLedger], + queryKey: ["useGetRpcTxs", rpcUrl, startLedger, headers], queryFn: async () => { const rpcServer = new StellarRpc.Server(rpcUrl, { headers, diff --git a/src/query/useHorizonHealthCheckUntilReady.ts b/src/query/useHorizonHealthCheckUntilReady.ts index 4c19e5eea..1e0bdcd4d 100644 --- a/src/query/useHorizonHealthCheckUntilReady.ts +++ b/src/query/useHorizonHealthCheckUntilReady.ts @@ -10,7 +10,7 @@ export const useHorizonHealthCheckUntilReady = ( headers: AnyObject, ) => { const query = useQuery({ - queryKey: ["useHorizonHealthCheckUntilReady", horizonUrl], + queryKey: ["useHorizonHealthCheckUntilReady", horizonUrl, headers], queryFn: async () => { if (!horizonUrl) { return null; diff --git a/src/query/useLatestLedger.ts b/src/query/useLatestLedger.ts index 43b2df10d..6516bc6d5 100644 --- a/src/query/useLatestLedger.ts +++ b/src/query/useLatestLedger.ts @@ -11,7 +11,7 @@ export const useLatestLedger = ({ headers: NetworkHeaders; }) => { const query = useQuery({ - queryKey: ["latestLedger"], + queryKey: ["latestLedger", rpcUrl, headers], queryFn: async () => { const rpcServer = new StellarRpc.Server(rpcUrl, { headers, diff --git a/src/query/useLatestTxn.ts b/src/query/useLatestTxn.ts index a22d677e0..476c003f2 100644 --- a/src/query/useLatestTxn.ts +++ b/src/query/useLatestTxn.ts @@ -8,7 +8,7 @@ export const useLatestTxn = ( queryKey: string[] = ["latestTxn"], ) => { const query = useQuery({ - queryKey: [...queryKey, rpcUrl], + queryKey: [...queryKey, rpcUrl, headers], queryFn: async () => { try { const rpcServer = new StellarRpc.Server(rpcUrl, { diff --git a/src/query/useRpcHealthCheckUntilReady.ts b/src/query/useRpcHealthCheckUntilReady.ts index 2d38abae9..b66e849a4 100644 --- a/src/query/useRpcHealthCheckUntilReady.ts +++ b/src/query/useRpcHealthCheckUntilReady.ts @@ -10,7 +10,7 @@ export const useRpcHealthCheckUntilReady = ( headers: AnyObject, ) => { const query = useQuery({ - queryKey: ["useRpcHealthCheckUntilReady", rpcUrl], + queryKey: ["useRpcHealthCheckUntilReady", rpcUrl, headers], queryFn: async () => { if (!rpcUrl) { return null; diff --git a/src/query/useWasmBinaryFromRpc.ts b/src/query/useWasmBinaryFromRpc.ts index ec0f9d742..3bcc838af 100644 --- a/src/query/useWasmBinaryFromRpc.ts +++ b/src/query/useWasmBinaryFromRpc.ts @@ -18,7 +18,7 @@ export const useWasmBinaryFromRpc = ({ headers?: NetworkHeaders; }) => { const query = useQuery({ - queryKey: ["useWasmBinaryFromRpc", wasmHash, rpcUrl], + queryKey: ["useWasmBinaryFromRpc", wasmHash, rpcUrl, headers], queryFn: async () => { if (!wasmHash || !rpcUrl) { return null; diff --git a/src/query/useWasmGitHubAttestation.ts b/src/query/useWasmGitHubAttestation.ts index 180eb5468..8183896a5 100644 --- a/src/query/useWasmGitHubAttestation.ts +++ b/src/query/useWasmGitHubAttestation.ts @@ -18,7 +18,7 @@ export const useWasmGitHubAttestation = ({ headers?: NetworkHeaders; }) => { const query = useQuery({ - queryKey: ["useWasmGitHubAttestation", wasmHash, rpcUrl], + queryKey: ["useWasmGitHubAttestation", wasmHash, rpcUrl, headers], queryFn: async () => { if (!wasmHash || !rpcUrl) { return null; From 6c773ffcbda443b4d68c3ed928fd9d44ad650c12 Mon Sep 17 00:00:00 2001 From: Jeesun Kim Date: Wed, 24 Jun 2026 11:02:54 -0700 Subject: [PATCH 3/7] chore(prettier): fix arrowParens typo and rename deprecated option Fix the "arrowParens:" key (stray colon meant Prettier silently ignored it) and rename the deprecated jsxBracketSameLine to bracketSameLine. Co-Authored-By: Claude Opus 4.8 (1M context) --- .prettierrc.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.prettierrc.json b/.prettierrc.json index d90ebd474..7ee127388 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,7 +1,7 @@ { - "arrowParens:": "always", + "arrowParens": "always", "bracketSpacing": true, - "jsxBracketSameLine": false, + "bracketSameLine": false, "printWidth": 80, "proseWrap": "always", "semi": true, From e7303834905e4afb350ba4642a97d01783ac65e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jeesun=20=EC=A7=80=EC=84=A0?= Date: Thu, 25 Jun 2026 15:51:26 -0700 Subject: [PATCH 4/7] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/query/useBuildRpcTransaction.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/query/useBuildRpcTransaction.ts b/src/query/useBuildRpcTransaction.ts index 1895f7337..b141622be 100644 --- a/src/query/useBuildRpcTransaction.ts +++ b/src/query/useBuildRpcTransaction.ts @@ -33,6 +33,7 @@ export const useBuildRpcTransaction = ({ queryKey: [ "buildRpcTransaction", publicKey, + rpcUrl, operation, networkPassphrase, timeoutInSeconds, From 7433dc89a6de71de942b40d140ef06643b6869ef Mon Sep 17 00:00:00 2001 From: Jeesun Kim Date: Fri, 26 Jun 2026 13:31:55 -0700 Subject: [PATCH 5/7] remove useQuery result from dependencies --- .../(sidebar)/transactions-explorer/page.tsx | 22 +++++++++++-------- src/app/(sidebar)/xdr/view/page.tsx | 16 +++++++++----- src/query/useBuildRpcTransaction.ts | 1 + 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/app/(sidebar)/transactions-explorer/page.tsx b/src/app/(sidebar)/transactions-explorer/page.tsx index 5fb3ba587..894e272a4 100644 --- a/src/app/(sidebar)/transactions-explorer/page.tsx +++ b/src/app/(sidebar)/transactions-explorer/page.tsx @@ -53,7 +53,11 @@ export default function Explorer() { return map; }); - const txsQuery = useGetRpcTxs({ + const { + refetch: refetchTxs, + isError, + error, + } = useGetRpcTxs({ rpcUrl: network.rpcUrl, headers: getNetworkHeaders(network, "rpc"), startLedger, @@ -104,10 +108,10 @@ export default function Explorer() { } try { - await txsQuery.refetch(); + const txsResult = await refetchTxs(); - if (txsQuery.data?.transactions && !txsQuery.error) { - for (const txinfo of txsQuery.data.transactions) { + if (txsResult.data?.transactions && !txsResult.error) { + for (const txinfo of txsResult.data.transactions) { const normalizedTx = await normalizeTransaction(txinfo); if (normalizedTx) { @@ -126,8 +130,8 @@ export default function Explorer() { .splice(-500); localStorage.setItem(localStorageKey, jsonStringify(txs)!); - if (txsQuery.data.latestLedger) { - setStartLedger(txsQuery.data.latestLedger); + if (txsResult.data.latestLedger) { + setStartLedger(txsResult.data.latestLedger); } } } catch (e) { @@ -144,16 +148,16 @@ export default function Explorer() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [ network?.rpcUrl, - txsQuery, + refetchTxs, iter, nextFetchAt, transactions, localStorageKey, ]); - const errorElement = txsQuery.isError ? ( + const errorElement = isError ? ( - {txsQuery.error.message} + {error?.message} ) : null; diff --git a/src/app/(sidebar)/xdr/view/page.tsx b/src/app/(sidebar)/xdr/view/page.tsx index d5bdbc862..e52c9d864 100644 --- a/src/app/(sidebar)/xdr/view/page.tsx +++ b/src/app/(sidebar)/xdr/view/page.tsx @@ -53,11 +53,10 @@ export default function ViewXdr() { isFetching: isLatestTxnFetching, isLoading: isLatestTxnLoading, refetch: fetchLatestTxn, - } = useLatestTxn( - network.rpcUrl, - getNetworkHeaders(network, "rpc"), - ["xdr", "latestTxn"], - ); + } = useLatestTxn(network.rpcUrl, getNetworkHeaders(network, "rpc"), [ + "xdr", + "latestTxn", + ]); const queryClient = useQueryClient(); @@ -208,7 +207,12 @@ export default function ViewXdr() { if (latestTxn) { // Reset query to clear old data queryClient.resetQueries({ - queryKey: ["xdr", "latestTxn", network.rpcUrl], + queryKey: [ + "xdr", + "latestTxn", + network.rpcUrl, + getNetworkHeaders(network, "rpc"), + ], exact: true, }); updateXdrBlob(""); diff --git a/src/query/useBuildRpcTransaction.ts b/src/query/useBuildRpcTransaction.ts index b141622be..56e2e5ad4 100644 --- a/src/query/useBuildRpcTransaction.ts +++ b/src/query/useBuildRpcTransaction.ts @@ -38,6 +38,7 @@ export const useBuildRpcTransaction = ({ networkPassphrase, timeoutInSeconds, headers, + rpcUrl, ], queryFn: async () => { if (!publicKey) { From 3a7f6705bff347d5806d21c4168a53d8469e1591 Mon Sep 17 00:00:00 2001 From: Jeesun Kim Date: Fri, 26 Jun 2026 13:59:52 -0700 Subject: [PATCH 6/7] throw an error propery from useGetRpcTx --- src/query/useGetRpcTxs.ts | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/query/useGetRpcTxs.ts b/src/query/useGetRpcTxs.ts index d44b34083..943c3f7cf 100644 --- a/src/query/useGetRpcTxs.ts +++ b/src/query/useGetRpcTxs.ts @@ -3,6 +3,22 @@ import { rpc as StellarRpc } from "@stellar/stellar-sdk"; import { useQuery } from "@tanstack/react-query"; +const getErrorMessage = (error: unknown) => { + if (error instanceof Error) { + return error.message; + } + + if (typeof error === "string") { + return error; + } + + try { + return JSON.stringify(error); + } catch { + return String(error); + } +}; + export const useGetRpcTxs = ({ rpcUrl, headers, @@ -33,7 +49,9 @@ export const useGetRpcTxs = ({ params.startLedger = latestLedger.sequence; } } catch (error) { - throw `there was an error with fetching latest ledger. e: ${error}`; + throw new Error( + `there was an error with fetching latest ledger. e: ${getErrorMessage(error)}`, + ); } try { @@ -41,7 +59,9 @@ export const useGetRpcTxs = ({ return response; } catch (error) { - throw `there was an error with fetching transactions. e: ${error}`; + throw new Error( + `there was an error with fetching transactions. e: ${getErrorMessage(error)}`, + ); } }, enabled: false, From 30c12d0b6edc5989462c72200cf7b2673d67f360 Mon Sep 17 00:00:00 2001 From: Jeesun Kim Date: Fri, 26 Jun 2026 14:19:15 -0700 Subject: [PATCH 7/7] extract getErrorMessage into errorUtils helper Co-Authored-By: Claude Opus 4.8 (1M context) --- src/helpers/errorUtils.ts | 22 ++++++++++++++++++++++ src/query/useAccountInfo.ts | 5 +++-- src/query/useGetRpcTxs.ts | 17 +---------------- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/helpers/errorUtils.ts b/src/helpers/errorUtils.ts index 1d3cccb6c..e493c1a51 100644 --- a/src/helpers/errorUtils.ts +++ b/src/helpers/errorUtils.ts @@ -1,3 +1,25 @@ +/** + * Extracts a human-readable message from an unknown error value. + * + * Handles `Error` instances, raw strings, and arbitrary objects (falling back + * to `JSON.stringify`, then `String`). + */ +export const getErrorMessage = (error: unknown): string => { + if (error instanceof Error) { + return error.message; + } + + if (typeof error === "string") { + return error; + } + + try { + return JSON.stringify(error); + } catch { + return String(error); + } +}; + export const isExternalError = (error: Error) => { const stack = error.stack || ""; diff --git a/src/query/useAccountInfo.ts b/src/query/useAccountInfo.ts index 0ee36f5a5..28c057219 100644 --- a/src/query/useAccountInfo.ts +++ b/src/query/useAccountInfo.ts @@ -1,3 +1,4 @@ +import { getErrorMessage } from "@/helpers/errorUtils"; import { NetworkHeaders } from "@/types/types"; import { useQuery } from "@tanstack/react-query"; @@ -31,8 +32,8 @@ export const useAccountInfo = ({ isFunded: true, details: responseJson, }; - } catch (e: any) { - throw `Something went wrong. ${e}`; + } catch (error) { + throw new Error(`Something went wrong. ${getErrorMessage(error)}`); } }, enabled: false, diff --git a/src/query/useGetRpcTxs.ts b/src/query/useGetRpcTxs.ts index 943c3f7cf..c83e7c38e 100644 --- a/src/query/useGetRpcTxs.ts +++ b/src/query/useGetRpcTxs.ts @@ -1,24 +1,9 @@ +import { getErrorMessage } from "@/helpers/errorUtils"; import { NetworkHeaders } from "@/types/types"; import { rpc as StellarRpc } from "@stellar/stellar-sdk"; import { useQuery } from "@tanstack/react-query"; -const getErrorMessage = (error: unknown) => { - if (error instanceof Error) { - return error.message; - } - - if (typeof error === "string") { - return error; - } - - try { - return JSON.stringify(error); - } catch { - return String(error); - } -}; - export const useGetRpcTxs = ({ rpcUrl, headers,