From 02c025c8d51b299c5c41e753faaefdc73371bd34 Mon Sep 17 00:00:00 2001 From: Kirill Date: Sat, 25 Apr 2026 22:58:37 +0000 Subject: [PATCH 1/3] fix: add error logging to AsyncStorage catch blocks 8 empty catch blocks in makeAsyncStorage.ts silently swallow all AsyncStorage errors. If storage fails (permissions, full disk, corrupted data), the app silently loses persisted data with no indication to the developer. This adds console.warn in __DEV__ mode, preserving the existing fail-silently behavior in production while making storage issues visible during development. Found during a static analysis sweep of 97 popular open source projects. --- packages/storage-rn/src/makeAsyncStorage.ts | 32 +++++++++++++++------ 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/storage-rn/src/makeAsyncStorage.ts b/packages/storage-rn/src/makeAsyncStorage.ts index 4beffdadd8..1891b7d42c 100644 --- a/packages/storage-rn/src/makeAsyncStorage.ts +++ b/packages/storage-rn/src/makeAsyncStorage.ts @@ -22,7 +22,9 @@ const parseData = (persistedData: any, fallback: any) => { if (persistedData) { return JSON.parse(persistedData); } - } catch (_err) {} + } catch (_err) { + if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + } return fallback; }; @@ -66,7 +68,9 @@ export const makeAsyncStorage: ( let persistedData: string | null = null; try { persistedData = await AsyncStorage.getItem(dataKey); - } catch (_err) {} + } catch (_err) { + if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + } const parsed = parseData(persistedData, {}); Object.assign(allData, parsed); @@ -84,7 +88,9 @@ export const makeAsyncStorage: ( if (syncNeeded) { try { await AsyncStorage.setItem(dataKey, JSON.stringify(allData)); - } catch (_err) {} + } catch (_err) { + if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + } } return Object.assign( @@ -98,7 +104,9 @@ export const makeAsyncStorage: ( let persistedData: string | null = null; try { persistedData = await AsyncStorage.getItem(dataKey); - } catch (_err) {} + } catch (_err) { + if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + } const parsed = parseData(persistedData, {}); Object.assign(allData, parsed); } @@ -121,20 +129,26 @@ export const makeAsyncStorage: ( try { await AsyncStorage.setItem(dataKey, JSON.stringify(allData)); - } catch (_err) {} + } catch (_err) { + if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + } }, writeMetadata: async data => { try { await AsyncStorage.setItem(metadataKey, JSON.stringify(data)); - } catch (_err) {} + } catch (_err) { + if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + } }, readMetadata: async () => { let persistedData: string | null = null; try { persistedData = await AsyncStorage.getItem(metadataKey); - } catch (_err) {} + } catch (_err) { + if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + } return parseData(persistedData, []); }, @@ -156,7 +170,9 @@ export const makeAsyncStorage: ( allData = {}; await AsyncStorage.removeItem(dataKey); await AsyncStorage.removeItem(metadataKey); - } catch (_err) {} + } catch (_err) { + if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + } }, }; }; From 12b22a715f5287fa9399d311b51434c823fe204a Mon Sep 17 00:00:00 2001 From: Kirill Date: Sat, 25 Apr 2026 23:04:58 +0000 Subject: [PATCH 2/3] fix: use process.env.NODE_ENV instead of __DEV__ for TS compat --- packages/storage-rn/src/makeAsyncStorage.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/storage-rn/src/makeAsyncStorage.ts b/packages/storage-rn/src/makeAsyncStorage.ts index 1891b7d42c..2a4e5d2108 100644 --- a/packages/storage-rn/src/makeAsyncStorage.ts +++ b/packages/storage-rn/src/makeAsyncStorage.ts @@ -23,7 +23,7 @@ const parseData = (persistedData: any, fallback: any) => { return JSON.parse(persistedData); } } catch (_err) { - if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); } return fallback; @@ -69,7 +69,7 @@ export const makeAsyncStorage: ( try { persistedData = await AsyncStorage.getItem(dataKey); } catch (_err) { - if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); } const parsed = parseData(persistedData, {}); @@ -89,7 +89,7 @@ export const makeAsyncStorage: ( try { await AsyncStorage.setItem(dataKey, JSON.stringify(allData)); } catch (_err) { - if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); } } @@ -105,7 +105,7 @@ export const makeAsyncStorage: ( try { persistedData = await AsyncStorage.getItem(dataKey); } catch (_err) { - if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); } const parsed = parseData(persistedData, {}); Object.assign(allData, parsed); @@ -130,7 +130,7 @@ export const makeAsyncStorage: ( try { await AsyncStorage.setItem(dataKey, JSON.stringify(allData)); } catch (_err) { - if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); } }, @@ -138,7 +138,7 @@ export const makeAsyncStorage: ( try { await AsyncStorage.setItem(metadataKey, JSON.stringify(data)); } catch (_err) { - if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); } }, @@ -147,7 +147,7 @@ export const makeAsyncStorage: ( try { persistedData = await AsyncStorage.getItem(metadataKey); } catch (_err) { - if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); } return parseData(persistedData, []); }, @@ -171,7 +171,7 @@ export const makeAsyncStorage: ( await AsyncStorage.removeItem(dataKey); await AsyncStorage.removeItem(metadataKey); } catch (_err) { - if (__DEV__) console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); } }, }; From e112f683e38cad7dae28e068a167a19e680af8eb Mon Sep 17 00:00:00 2001 From: Kirill Date: Sat, 25 Apr 2026 23:11:08 +0000 Subject: [PATCH 3/3] style: format with prettier --- packages/storage-rn/src/makeAsyncStorage.ts | 24 ++++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/storage-rn/src/makeAsyncStorage.ts b/packages/storage-rn/src/makeAsyncStorage.ts index 2a4e5d2108..214da8fb9c 100644 --- a/packages/storage-rn/src/makeAsyncStorage.ts +++ b/packages/storage-rn/src/makeAsyncStorage.ts @@ -23,7 +23,8 @@ const parseData = (persistedData: any, fallback: any) => { return JSON.parse(persistedData); } } catch (_err) { - if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') + console.warn('[urql] AsyncStorage error:', _err); } return fallback; @@ -69,7 +70,8 @@ export const makeAsyncStorage: ( try { persistedData = await AsyncStorage.getItem(dataKey); } catch (_err) { - if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') + console.warn('[urql] AsyncStorage error:', _err); } const parsed = parseData(persistedData, {}); @@ -89,7 +91,8 @@ export const makeAsyncStorage: ( try { await AsyncStorage.setItem(dataKey, JSON.stringify(allData)); } catch (_err) { - if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') + console.warn('[urql] AsyncStorage error:', _err); } } @@ -105,7 +108,8 @@ export const makeAsyncStorage: ( try { persistedData = await AsyncStorage.getItem(dataKey); } catch (_err) { - if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') + console.warn('[urql] AsyncStorage error:', _err); } const parsed = parseData(persistedData, {}); Object.assign(allData, parsed); @@ -130,7 +134,8 @@ export const makeAsyncStorage: ( try { await AsyncStorage.setItem(dataKey, JSON.stringify(allData)); } catch (_err) { - if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') + console.warn('[urql] AsyncStorage error:', _err); } }, @@ -138,7 +143,8 @@ export const makeAsyncStorage: ( try { await AsyncStorage.setItem(metadataKey, JSON.stringify(data)); } catch (_err) { - if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') + console.warn('[urql] AsyncStorage error:', _err); } }, @@ -147,7 +153,8 @@ export const makeAsyncStorage: ( try { persistedData = await AsyncStorage.getItem(metadataKey); } catch (_err) { - if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') + console.warn('[urql] AsyncStorage error:', _err); } return parseData(persistedData, []); }, @@ -171,7 +178,8 @@ export const makeAsyncStorage: ( await AsyncStorage.removeItem(dataKey); await AsyncStorage.removeItem(metadataKey); } catch (_err) { - if (process.env.NODE_ENV !== 'production') console.warn('[urql] AsyncStorage error:', _err); + if (process.env.NODE_ENV !== 'production') + console.warn('[urql] AsyncStorage error:', _err); } }, };