Skip to content

Commit 8ffea9d

Browse files
committed
feat: report deprecated method usage
1 parent 98825ec commit 8ffea9d

7 files changed

Lines changed: 135 additions & 54 deletions

File tree

src/consent.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import KitFilterHelper from './kitFilterHelper';
99
import Constants from './constants';
1010
import { IMParticleUser } from './identity-user-interfaces';
1111
import { IMParticleWebSDKInstance } from './mp-instance';
12+
import { logDeprecatedApiUsage } from './reporting/deprecatedApiLogger';
1213

1314
const { CCPAPurpose } = Constants;
1415

@@ -505,9 +506,10 @@ export default function Consent(this: IConsent, mpInstance: IMParticleWebSDKInst
505506

506507
// TODO: Can we remove this? It is deprecated.
507508
function removeCCPAState(this: ConsentState) {
508-
mpInstance.Logger.warning(
509-
'removeCCPAState is deprecated and will be removed in a future release; use removeCCPAConsentState instead'
510-
);
509+
logDeprecatedApiUsage(mpInstance, {
510+
methodName: 'removeCCPAState',
511+
warningMessage: 'removeCCPAState is deprecated and will be removed in a future release; use removeCCPAConsentState instead',
512+
});
511513
// @ts-ignore
512514
return removeCCPAConsentState();
513515
}

src/identity.js

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
} from './utils';
2121
import { hasMPIDAndUserLoginChanged, hasMPIDChanged } from './user-utils';
2222
import { processReadyQueue } from './pre-init-utils';
23+
import { logDeprecatedApiUsage } from './reporting/deprecatedApiLogger';
2324

2425
export default function Identity(mpInstance) {
2526
const { getFeatureFlag, extend } = mpInstance._Helpers;
@@ -1334,44 +1335,47 @@ export default function Identity(mpInstance) {
13341335
* @deprecated
13351336
*/
13361337
add: function() {
1337-
mpInstance.Logger.warning(
1338-
generateDeprecationMessage(
1338+
logDeprecatedApiUsage(mpInstance, {
1339+
methodName: 'Identity.getCurrentUser().getCart().add()',
1340+
warningMessage: generateDeprecationMessage(
13391341
'Identity.getCurrentUser().getCart().add()',
13401342
true,
13411343
'eCommerce.logProductAction()',
13421344
'https://docs.mparticle.com/developers/sdk/web/commerce-tracking'
1343-
)
1344-
);
1345+
),
1346+
});
13451347
},
13461348
/**
13471349
* Removes a cart product from the current user cart
13481350
* @method remove
13491351
* @deprecated
13501352
*/
13511353
remove: function() {
1352-
mpInstance.Logger.warning(
1353-
generateDeprecationMessage(
1354+
logDeprecatedApiUsage(mpInstance, {
1355+
methodName: 'Identity.getCurrentUser().getCart().remove()',
1356+
warningMessage: generateDeprecationMessage(
13541357
'Identity.getCurrentUser().getCart().remove()',
13551358
true,
13561359
'eCommerce.logProductAction()',
13571360
'https://docs.mparticle.com/developers/sdk/web/commerce-tracking'
1358-
)
1359-
);
1361+
),
1362+
});
13601363
},
13611364
/**
13621365
* Clears the user's cart
13631366
* @method clear
13641367
* @deprecated
13651368
*/
13661369
clear: function() {
1367-
mpInstance.Logger.warning(
1368-
generateDeprecationMessage(
1370+
logDeprecatedApiUsage(mpInstance, {
1371+
methodName: 'Identity.getCurrentUser().getCart().clear()',
1372+
warningMessage: generateDeprecationMessage(
13691373
'Identity.getCurrentUser().getCart().clear()',
13701374
true,
13711375
'',
13721376
'https://docs.mparticle.com/developers/sdk/web/commerce-tracking'
1373-
)
1374-
);
1377+
),
1378+
});
13751379
},
13761380
/**
13771381
* Returns all cart products
@@ -1380,14 +1384,16 @@ export default function Identity(mpInstance) {
13801384
* @deprecated
13811385
*/
13821386
getCartProducts: function() {
1383-
mpInstance.Logger.warning(
1384-
generateDeprecationMessage(
1387+
logDeprecatedApiUsage(mpInstance, {
1388+
methodName:
1389+
'Identity.getCurrentUser().getCart().getCartProducts()',
1390+
warningMessage: generateDeprecationMessage(
13851391
'Identity.getCurrentUser().getCart().getCartProducts()',
13861392
true,
13871393
'eCommerce.logProductAction()',
13881394
'https://docs.mparticle.com/developers/sdk/web/commerce-tracking'
1389-
)
1390-
);
1395+
),
1396+
});
13911397
return [];
13921398
},
13931399
};
@@ -1536,12 +1542,7 @@ export default function Identity(mpInstance) {
15361542
newUser = mpInstance.Identity.getCurrentUser();
15371543

15381544
// https://go.mparticle.com/work/SQDSDKS-6359
1539-
tryOnUserAlias(
1540-
prevUser,
1541-
newUser,
1542-
identityApiData,
1543-
mpInstance.Logger
1544-
);
1545+
tryOnUserAlias(prevUser, newUser, identityApiData, mpInstance);
15451546

15461547
const persistence = mpInstance._Persistence.getPersistence();
15471548

@@ -1775,17 +1776,20 @@ export default function Identity(mpInstance) {
17751776
}
17761777

17771778
// https://go.mparticle.com/work/SQDSDKS-6359
1778-
function tryOnUserAlias(previousUser, newUser, identityApiData, logger) {
1779+
function tryOnUserAlias(previousUser, newUser, identityApiData, mpInstance) {
17791780
if (
17801781
identityApiData &&
17811782
identityApiData.onUserAlias &&
17821783
isFunction(identityApiData.onUserAlias)
17831784
) {
17841785
try {
1785-
logger.warning(generateDeprecationMessage('onUserAlias'));
1786+
logDeprecatedApiUsage(mpInstance, {
1787+
methodName: 'onUserAlias',
1788+
warningMessage: generateDeprecationMessage('onUserAlias'),
1789+
});
17861790
identityApiData.onUserAlias(previousUser, newUser);
17871791
} catch (e) {
1788-
logger.error(
1792+
mpInstance.Logger.error(
17891793
'There was an error with your onUserAlias function - ' + e
17901794
);
17911795
}

src/mp-instance.ts

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import CookieConsentManager, { ICookieConsentManager } from './cookieConsentMana
5555
import { ErrorReportingDispatcher } from './reporting/errorReportingDispatcher';
5656
import { LoggingDispatcher } from './reporting/loggingDispatcher';
5757
import { IErrorReportingService, ILoggingService } from './reporting/types';
58+
import { logDeprecatedApiUsage } from './reporting/deprecatedApiLogger';
5859

5960
export interface IErrorLogMessage {
6061
message?: string;
@@ -772,14 +773,15 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan
772773
* @deprecated
773774
*/
774775
add: function(product, logEventBoolean) {
775-
self.Logger.warning(
776-
generateDeprecationMessage(
776+
logDeprecatedApiUsage(self, {
777+
methodName: 'eCommerce.Cart.add()',
778+
warningMessage: generateDeprecationMessage(
777779
'eCommerce.Cart.add()',
778780
true,
779781
'eCommerce.logProductAction()',
780782
'https://docs.mparticle.com/developers/sdk/web/commerce-tracking'
781-
)
782-
);
783+
),
784+
});
783785
},
784786
/**
785787
* Removes a product from the cart
@@ -789,29 +791,31 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan
789791
* @deprecated
790792
*/
791793
remove: function(product, logEventBoolean) {
792-
self.Logger.warning(
793-
generateDeprecationMessage(
794+
logDeprecatedApiUsage(self, {
795+
methodName: 'eCommerce.Cart.remove()',
796+
warningMessage: generateDeprecationMessage(
794797
'eCommerce.Cart.remove()',
795798
true,
796799
'eCommerce.logProductAction()',
797800
'https://docs.mparticle.com/developers/sdk/web/commerce-tracking'
798-
)
799-
);
801+
),
802+
});
800803
},
801804
/**
802805
* Clears the cart
803806
* @method clear
804807
* @deprecated
805808
*/
806809
clear: function() {
807-
self.Logger.warning(
808-
generateDeprecationMessage(
810+
logDeprecatedApiUsage(self, {
811+
methodName: 'eCommerce.Cart.clear()',
812+
warningMessage: generateDeprecationMessage(
809813
'eCommerce.Cart.clear()',
810814
true,
811815
'',
812816
'https://docs.mparticle.com/developers/sdk/web/commerce-tracking'
813-
)
814-
);
817+
),
818+
});
815819
},
816820
},
817821
/**
@@ -940,9 +944,10 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan
940944
* @deprecated
941945
*/
942946
logCheckout: function(step, option, attrs, customFlags) {
943-
self.Logger.warning(
944-
'mParticle.logCheckout is deprecated, please use mParticle.logProductAction instead'
945-
);
947+
logDeprecatedApiUsage(self, {
948+
methodName: 'mParticle.logCheckout',
949+
warningMessage: 'mParticle.logCheckout is deprecated, please use mParticle.logProductAction instead',
950+
});
946951

947952
if (!self._Store.isInitialized) {
948953
self.ready(function() {
@@ -1020,9 +1025,10 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan
10201025
attrs,
10211026
customFlags
10221027
) {
1023-
self.Logger.warning(
1024-
'mParticle.logPurchase is deprecated, please use mParticle.logProductAction instead'
1025-
);
1028+
logDeprecatedApiUsage(self, {
1029+
methodName: 'mParticle.logPurchase',
1030+
warningMessage: 'mParticle.logPurchase is deprecated, please use mParticle.logProductAction instead',
1031+
});
10261032
if (!self._Store.isInitialized) {
10271033
self.ready(function() {
10281034
self.eCommerce.logPurchase(
@@ -1132,9 +1138,10 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan
11321138
attrs,
11331139
customFlags
11341140
) {
1135-
self.Logger.warning(
1136-
'mParticle.logRefund is deprecated, please use mParticle.logProductAction instead'
1137-
);
1141+
logDeprecatedApiUsage(self, {
1142+
methodName: 'mParticle.logRefund',
1143+
warningMessage: 'mParticle.logRefund is deprecated, please use mParticle.logProductAction instead',
1144+
});
11381145
if (!self._Store.isInitialized) {
11391146
self.ready(function() {
11401147
self.eCommerce.logRefund(
@@ -1741,4 +1748,3 @@ function queueIfNotInitialized(func, self) {
17411748
});
17421749
return true;
17431750
}
1744-
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { ErrorCodes, ILoggingService } from './types';
2+
3+
interface DeprecatedApiLoggerInstance {
4+
Logger?: {
5+
warning(message: string): void;
6+
};
7+
_LoggingDispatcher?: ILoggingService;
8+
}
9+
10+
interface DeprecatedApiUsage {
11+
methodName: string;
12+
warningMessage: string;
13+
}
14+
15+
export function logDeprecatedApiUsage(
16+
mpInstance: DeprecatedApiLoggerInstance,
17+
usage: DeprecatedApiUsage
18+
): void {
19+
mpInstance.Logger?.warning(usage.warningMessage);
20+
mpInstance._LoggingDispatcher?.log({
21+
message: usage.methodName,
22+
code: ErrorCodes.MP_DEPRECATED_METHOD_USAGE,
23+
});
24+
}

src/reporting/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export const ErrorCodes = {
66
IDENTITY_REQUEST: 'IDENTITY_REQUEST',
77
IDENTITY_MISMATCH: 'IDENTITY_MISMATCH',
88
ROKT_KIT_ATTACHED: 'ROKT_KIT_ATTACHED',
9+
MP_DEPRECATED_METHOD_USAGE: 'MP_DEPRECATED_METHOD_USAGE',
910
} as const;
1011

1112
export type ErrorCodes = valueof<typeof ErrorCodes>;

src/sessionManager.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { generateDeprecationMessage } from './utils';
66
import { IMParticleUser } from './identity-user-interfaces';
77
import { IMParticleWebSDKInstance } from './mp-instance';
88
import { hasIdentityRequestChanged, hasExplicitIdentifier } from './identity-utils';
9+
import { logDeprecatedApiUsage } from './reporting/deprecatedApiLogger';
910

1011
const { Messages } = Constants;
1112

@@ -67,13 +68,14 @@ export default function SessionManager(
6768
};
6869

6970
this.getSession = function (): string {
70-
mpInstance.Logger.warning(
71-
generateDeprecationMessage(
71+
logDeprecatedApiUsage(mpInstance, {
72+
methodName: 'SessionManager.getSession()',
73+
warningMessage: generateDeprecationMessage(
7274
'SessionManager.getSession()',
7375
false,
7476
'SessionManager.getSessionId()'
75-
)
76-
);
77+
),
78+
});
7779
return this.getSessionId();
7880
};
7981

test/jest/reportingLogger.spec.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ErrorReportingDispatcher } from '../../src/reporting/errorReportingDispatcher';
22
import { LoggingDispatcher } from '../../src/reporting/loggingDispatcher';
33
import { IErrorReportingService, ILoggingService, ISDKError, ISDKLogEntry, WSDKErrorSeverity, ErrorCodes } from '../../src/reporting/types';
4+
import { logDeprecatedApiUsage } from '../../src/reporting/deprecatedApiLogger';
45

56
describe('ErrorReportingDispatcher', () => {
67
let dispatcher: ErrorReportingDispatcher;
@@ -128,3 +129,44 @@ describe('LoggingDispatcher', () => {
128129
expect(service2.log).toHaveBeenCalledWith(entry);
129130
});
130131
});
132+
133+
describe('logDeprecatedApiUsage', () => {
134+
it('keeps the console warning and emits structured usage details', () => {
135+
const warning = jest.fn();
136+
const log = jest.fn();
137+
138+
logDeprecatedApiUsage(
139+
{
140+
Logger: { warning },
141+
_LoggingDispatcher: { log },
142+
},
143+
{
144+
methodName: 'mParticle.logCheckout',
145+
warningMessage: 'mParticle.logCheckout is deprecated, please use mParticle.logProductAction instead',
146+
}
147+
);
148+
149+
expect(warning).toHaveBeenCalledWith(
150+
'mParticle.logCheckout is deprecated, please use mParticle.logProductAction instead'
151+
);
152+
expect(log).toHaveBeenCalledWith({
153+
message: 'mParticle.logCheckout',
154+
code: ErrorCodes.MP_DEPRECATED_METHOD_USAGE,
155+
});
156+
});
157+
158+
it('does not require a registered logging dispatcher', () => {
159+
const warning = jest.fn();
160+
161+
expect(() => logDeprecatedApiUsage(
162+
{ Logger: { warning } },
163+
{
164+
methodName: 'onUserAlias',
165+
warningMessage: 'onUserAlias is a deprecated method and will be removed in future releases.',
166+
}
167+
)).not.toThrow();
168+
expect(warning).toHaveBeenCalledWith(
169+
'onUserAlias is a deprecated method and will be removed in future releases.'
170+
);
171+
});
172+
});

0 commit comments

Comments
 (0)