Structural sharing drops a `__proto__` key from query data and changes the object's prototype
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
- #12304 par @Gourav224 — fermée sans fusion
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 35/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- typescript
- Domaine
- frontend
Piste de recherche
The issue identifies replaceEqualDeep and explains how assigning the __proto__ key changes the copy's prototype. Start by locating that function and checking its existing tests for structural sharing. Done means refetching changed data preserves __proto__ as an own property and leaves the result's prototype as Object.prototype; the reporter says they plan to open a PR.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Describe the bug
If query data has a "__proto__" key (JSON.parse keeps it as a normal property), it disappears after a refetch where anything else in that object changed.
replaceEqualDeep builds the new object with copy[key] = value. For __proto__ that assignment calls the setter and changes the copy's prototype instead of adding a property. So the key is gone, and its contents show up as inherited properties instead.
The first fetch is fine, because there is no previous data to share with.
Your minimal, reproducible example
import { replaceEqualDeep } from '@tanstack/query-core'
const prev = JSON.parse('{"__proto__":{"admin":true},"count":1}')
const next = JSON.parse('{"__proto__":{"admin":true},"count":2}')
const result = replaceEqualDeep(prev, next)
Object.keys(result) // ['count']
JSON.stringify(result) // '{"count":2}'
result.admin // true (inherited)
Steps to reproduce
- Return JSON with a
__proto__key from a queryFn, for example a map keyed by user input. - Refetch so that some other field in that object changes.
data.__proto__is no longer an own key, and the object's prototype is now that value.
Expected behavior
__proto__ stays an own property, like any other key, and the prototype stays Object.prototype.
Platform
Any. Reproduced on Node 24.
TanStack Query version
5.104.5 (main)
Additional context
I have a small fix with tests and will open a PR.
- Langage dominant
- TypeScript
- Étoiles
- 50.5k
- Forks
- 4.2k
- Merge moyen
- 8 h 14 min
- PR mergées (30 j)
- 632
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de TanStack/query
-
solid-query: STRICT_READ_UNTRACKED on Solid 2 — client()/options() read in component body (useMutation, useBaseQuery)Peut-être à nouveau libre @LeonxLJX l’a pris il y a 53 jours, et aucune pull request n’est ouverte. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
TanStack/query#11358 · 2 commentaires · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
useBaseQuery fetches the old query key when an <Activity> tree is revealedPeut-être pris @lazerg l’a pris il y a 6 jours. Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 35/100
Les mainteneurs répondent en général sous 1 jour
-
[query-broadcast-client-experimental] broadcastQueryClient: an `added` event overwrites a receiving query that has no data (e.g. in error) with the sender's empty statePeut-être pris @lazerg l’a pris il y a 7 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 25/100
Les mainteneurs répondent en général sous 1 jour
-
solid-query 6.0.0-rc.5: onCacheEvent throws NotReadyError during a Solid 2 (rc.14+) transition landingPeut-être pris @UzumakiODZ l’a pris il y a 12 jours. Ouverte
Difficulté 4/5 3-5 jours Accessibilité débutants 28/100
TanStack/query#12031 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Explicit gcTime schedules a GC timer during SSR, retaining the whole render in memoryPeut-être pris @AdzerKI l’a pris il y a 13 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 25/100
TanStack/query#12025 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de TanStack/query
Issues similaires
-
category::task code priority::normal
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
e0ipso/strikethroo#145 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 1-3 heures Accessibilité débutants 85/100
cocos/cocos-docs#3333 ·
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
RevenueCat/react-native-purchases#2079 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
RevenueCat/purchases-hybrid-common#2039 ·
Les mainteneurs répondent en général sous 1 jour
-
agent-reported area/react bug
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour