From 022186b0cdde8ae1d8054a911efabfe8d69a82d4 Mon Sep 17 00:00:00 2001 From: Olivier Savignac <1275666+sircharlo@users.noreply.github.com> Date: Mon, 25 Nov 2024 21:58:55 -0500 Subject: [PATCH 1/3] feat(vue): Apply stateTransformer to attachments in createSentryPiniaPlugin --- packages/vue/src/pinia.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/vue/src/pinia.ts b/packages/vue/src/pinia.ts index 56e38c33bad7..fbccbb56cd9e 100644 --- a/packages/vue/src/pinia.ts +++ b/packages/vue/src/pinia.ts @@ -26,6 +26,12 @@ export const createSentryPiniaPlugin: (options?: SentryPiniaPluginOptions) => Pi }, ) => { const plugin: PiniaPlugin = ({ store }) => { + let transformedState = store.$state; + try { + transformedState = options.stateTransformer ? options.stateTransformer(store.$state) : store.$state; + } catch (_) { + // If stateTransformer throws, let's just use the unmodified state + } options.attachPiniaState !== false && getGlobalScope().addEventProcessor((event, hint) => { try { @@ -37,7 +43,7 @@ export const createSentryPiniaPlugin: (options?: SentryPiniaPluginOptions) => Pi ...(hint.attachments || []), { filename, - data: JSON.stringify(store.$state), + data: JSON.stringify(transformedState), }, ]; } catch (_) { @@ -66,7 +72,6 @@ export const createSentryPiniaPlugin: (options?: SentryPiniaPluginOptions) => Pi } /* Set latest state to scope */ - const transformedState = options.stateTransformer ? options.stateTransformer(store.$state) : store.$state; const scope = getCurrentScope(); const currentState = scope.getScopeData().contexts.state; From 89c9f1dc6a1b5b79e4631dbf84ccabfec4b538f9 Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Mon, 14 Apr 2025 10:02:15 +0200 Subject: [PATCH 2/3] review comments --- packages/vue/src/pinia.ts | 65 ++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/packages/vue/src/pinia.ts b/packages/vue/src/pinia.ts index 57fe9dcf826d..004c416f9baa 100644 --- a/packages/vue/src/pinia.ts +++ b/packages/vue/src/pinia.ts @@ -13,37 +13,42 @@ type PiniaPlugin = (context: { }) => void; type SentryPiniaPluginOptions = { - attachPiniaState?: boolean; - addBreadcrumbs?: boolean; - actionTransformer?: (action: string) => any; - stateTransformer?: (state: Record) => any; + attachPiniaState: boolean; + addBreadcrumbs: boolean; + actionTransformer: (action: string) => any; + stateTransformer: (state: Record) => any; }; -export const createSentryPiniaPlugin: (options?: SentryPiniaPluginOptions) => PiniaPlugin = ( - options: SentryPiniaPluginOptions = { - attachPiniaState: true, - addBreadcrumbs: true, - actionTransformer: action => action, - stateTransformer: state => state, - }, -) => { - const plugin: PiniaPlugin = ({ store, pinia }) => { - const getAllStoreStates = ( - stateTransformer?: SentryPiniaPluginOptions['stateTransformer'], - ): Record => { - const states: Record = {}; +const DEFAULT_PINIA_PLUGIN_OPTIONS: SentryPiniaPluginOptions = { + attachPiniaState: true, + addBreadcrumbs: true, + actionTransformer: action => action, + stateTransformer: state => state, +}; - Object.keys(pinia.state.value).forEach(storeId => { - states[storeId] = pinia.state.value[storeId]; - }); +const getAllStoreStates = ( + pinia: { state: Ref> }, + stateTransformer?: SentryPiniaPluginOptions['stateTransformer'], +): Record => { + const states: Record = {}; + + try { + Object.keys(pinia.state.value).forEach(storeId => { + states[storeId] = pinia.state.value[storeId]; + }); + + return stateTransformer ? stateTransformer(states) : states; + } catch { + return states; + } +}; - try { - return stateTransformer ? stateTransformer(states) : states; - } catch { - return states; - } - }; +export const createSentryPiniaPlugin: ( + userOptions?: Partial, +) => PiniaPlugin = userOptions => { + const options: SentryPiniaPluginOptions = { ...userOptions, ...DEFAULT_PINIA_PLUGIN_OPTIONS }; + const plugin: PiniaPlugin = ({ store, pinia }) => { options.attachPiniaState !== false && getGlobalScope().addEventProcessor((event, hint) => { try { @@ -61,7 +66,7 @@ export const createSentryPiniaPlugin: (options?: SentryPiniaPluginOptions) => Pi ...(hint.attachments || []), { filename, - data: JSON.stringify(getAllStoreStates(options.stateTransformer)), + data: JSON.stringify(getAllStoreStates(pinia, options.stateTransformer)), }, ]; } @@ -74,9 +79,7 @@ export const createSentryPiniaPlugin: (options?: SentryPiniaPluginOptions) => Pi store.$onAction(context => { context.after(() => { - const transformedActionName = options.actionTransformer - ? options.actionTransformer(context.name) - : context.name; + const transformedActionName = options.actionTransformer(context.name); if ( typeof transformedActionName !== 'undefined' && @@ -91,7 +94,7 @@ export const createSentryPiniaPlugin: (options?: SentryPiniaPluginOptions) => Pi } /* Set latest state of all stores to scope */ - const allStates = getAllStoreStates(options.stateTransformer); + const allStates = getAllStoreStates(pinia, options.stateTransformer); const scope = getCurrentScope(); const currentState = scope.getScopeData().contexts.state; From 2d54f08dac4c45cc6cad1804af2aa89720edabe3 Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Mon, 14 Apr 2025 13:27:33 +0200 Subject: [PATCH 3/3] reverse order of destructuring --- packages/vue/src/pinia.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue/src/pinia.ts b/packages/vue/src/pinia.ts index 004c416f9baa..9d576a461cef 100644 --- a/packages/vue/src/pinia.ts +++ b/packages/vue/src/pinia.ts @@ -46,7 +46,7 @@ const getAllStoreStates = ( export const createSentryPiniaPlugin: ( userOptions?: Partial, ) => PiniaPlugin = userOptions => { - const options: SentryPiniaPluginOptions = { ...userOptions, ...DEFAULT_PINIA_PLUGIN_OPTIONS }; + const options: SentryPiniaPluginOptions = { ...DEFAULT_PINIA_PLUGIN_OPTIONS, ...userOptions }; const plugin: PiniaPlugin = ({ store, pinia }) => { options.attachPiniaState !== false &&