@@ -22,6 +22,104 @@ export function applyScopeDataToEvent(event: Event, data: ScopeData): void {
2222 applySdkMetadataToEvent ( event , sdkProcessingMetadata , propagationContext ) ;
2323}
2424
25+ /** Merge data of two scopes together. */
26+ export function mergeScopeData ( data : ScopeData , mergeData : ScopeData ) : void {
27+ const {
28+ extra,
29+ tags,
30+ user,
31+ contexts,
32+ level,
33+ sdkProcessingMetadata,
34+ breadcrumbs,
35+ fingerprint,
36+ eventProcessors,
37+ attachments,
38+ propagationContext,
39+ transactionName,
40+ span,
41+ } = mergeData ;
42+
43+ mergePropOverwrite ( data , 'extra' , extra ) ;
44+ mergePropOverwrite ( data , 'tags' , tags ) ;
45+ mergePropOverwrite ( data , 'user' , user ) ;
46+ mergePropOverwrite ( data , 'contexts' , contexts ) ;
47+ mergePropOverwrite ( data , 'sdkProcessingMetadata' , sdkProcessingMetadata ) ;
48+
49+ if ( level ) {
50+ data . level = level ;
51+ }
52+
53+ if ( transactionName ) {
54+ data . transactionName = transactionName ;
55+ }
56+
57+ if ( span ) {
58+ data . span = span ;
59+ }
60+
61+ if ( breadcrumbs . length ) {
62+ data . breadcrumbs = [ ...data . breadcrumbs , ...breadcrumbs ] ;
63+ }
64+
65+ if ( fingerprint . length ) {
66+ data . fingerprint = [ ...data . fingerprint , ...fingerprint ] ;
67+ }
68+
69+ if ( eventProcessors . length ) {
70+ data . eventProcessors = [ ...data . eventProcessors , ...eventProcessors ] ;
71+ }
72+
73+ if ( attachments . length ) {
74+ data . attachments = [ ...data . attachments , ...attachments ] ;
75+ }
76+
77+ data . propagationContext = { ...data . propagationContext , ...propagationContext } ;
78+ }
79+
80+ /**
81+ * Merge properties, overwriting existing keys.
82+ * Exported only for tests.
83+ */
84+ export function mergePropOverwrite <
85+ Prop extends 'extra' | 'tags' | 'user' | 'contexts' | 'sdkProcessingMetadata' ,
86+ Data extends ScopeData | Event ,
87+ > ( data : Data , prop : Prop , mergeVal : Data [ Prop ] ) : void {
88+ if ( mergeVal && Object . keys ( mergeVal ) . length ) {
89+ data [ prop ] = { ...data [ prop ] , ...mergeVal } ;
90+ }
91+ }
92+
93+ /**
94+ * Merge properties, keeping existing keys.
95+ * Exported only for tests.
96+ */
97+ export function mergePropKeep <
98+ Prop extends 'extra' | 'tags' | 'user' | 'contexts' | 'sdkProcessingMetadata' ,
99+ Data extends ScopeData | Event ,
100+ > ( data : Data , prop : Prop , mergeVal : Data [ Prop ] ) : void {
101+ if ( mergeVal && Object . keys ( mergeVal ) . length ) {
102+ data [ prop ] = { ...mergeVal , ...data [ prop ] } ;
103+ }
104+ }
105+
106+ /** Exported only for tests */
107+ export function mergeArray < Prop extends 'breadcrumbs' | 'fingerprint' > (
108+ event : Event ,
109+ prop : Prop ,
110+ mergeVal : ScopeData [ Prop ] ,
111+ ) : void {
112+ const prevVal = event [ prop ] ;
113+ // If we are not merging any new values,
114+ // we only need to proceed if there was an empty array before (as we want to replace it with undefined)
115+ if ( ! mergeVal . length && ( ! prevVal || prevVal . length ) ) {
116+ return ;
117+ }
118+
119+ const merged = [ ...( prevVal || [ ] ) , ...mergeVal ] as ScopeData [ Prop ] ;
120+ event [ prop ] = merged . length ? merged : undefined ;
121+ }
122+
25123function applyDataToEvent ( event : Event , data : ScopeData ) : void {
26124 const { extra, tags, user, contexts, level, transactionName } = data ;
27125
0 commit comments