Skip to content

Commit 65b77c1

Browse files
refactor: Migrate mParticle Instance Manager to TypeScript (#973)
1 parent 539ff3d commit 65b77c1

21 files changed

+60
-58
lines changed

rollup.config.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const babelMinify = babel({
3838

3939
const builds = {
4040
iife: {
41-
input: 'src/mparticle-instance-manager.js',
41+
input: 'src/mparticle-instance-manager.ts',
4242
output: {
4343
...defaultOutputOptions,
4444
file: 'dist/mparticle.js',
@@ -56,7 +56,7 @@ const builds = {
5656
],
5757
},
5858
cjs: {
59-
input: 'src/mparticle-instance-manager.js',
59+
input: 'src/mparticle-instance-manager.ts',
6060
output: {
6161
...defaultOutputOptions,
6262
file: 'dist/mparticle.common.js',
@@ -76,7 +76,7 @@ const builds = {
7676
],
7777
},
7878
esm: {
79-
input: 'src/mparticle-instance-manager.js',
79+
input: 'src/mparticle-instance-manager.ts',
8080
output: {
8181
...defaultOutputOptions,
8282
file: 'dist/mparticle.esm.js',

src/mparticle-instance-manager.js renamed to src/mparticle-instance-manager.ts

+28-15
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import Polyfill from './polyfill';
2-
import Types from './types';
2+
import Types, { CommerceEventType, EventType, ProductActionType, PromotionActionType } from './types';
33
import Constants from './constants';
4-
import mParticleInstance from './mp-instance.js';
4+
import mParticleInstance, { IMParticleWebSDKInstance } from './mp-instance.js';
55
import _BatchValidator from './mockBatchCreator';
66
import MPSideloadedKit from './sideloadedKit';
7+
import { IMParticleInstanceManager } from './sdkRuntimeModels';
8+
import { IStore } from './store';
9+
import { Dictionary } from '@mparticle/web-sdk';
10+
import { valueof } from './utils';
711

812
if (!Array.prototype.forEach) {
913
Array.prototype.forEach = Polyfill.forEach;
@@ -17,20 +21,23 @@ if (!Array.prototype.filter) {
1721
Array.prototype.filter = Polyfill.filter;
1822
}
1923

24+
// https://go.mparticle.com/work/SQDSDKS-6768
2025
if (!Array.isArray) {
26+
// @ts-ignore
2127
Array.prototype.isArray = Polyfill.isArray;
2228
}
2329

24-
function mParticle() {
25-
var self = this;
30+
function mParticleInstanceManager(this: IMParticleInstanceManager) {
31+
const self = this;
2632
// Only leaving this here in case any clients are trying to access mParticle.Store, to prevent from throwing
27-
this.Store = {};
28-
this._instances = {};
33+
this.Store = {} as IStore;
34+
this._instances = {} as Dictionary<IMParticleWebSDKInstance>;
2935
this.IdentityType = Types.IdentityType;
30-
this.EventType = Types.EventType;
31-
this.CommerceEventType = Types.CommerceEventType;
32-
this.PromotionType = Types.PromotionActionType;
33-
this.ProductActionType = Types.ProductActionType;
36+
this.EventType = EventType as unknown as valueof<typeof EventType>;
37+
this.CommerceEventType = CommerceEventType as unknown as valueof<typeof CommerceEventType>;
38+
this.PromotionType = PromotionActionType as unknown as valueof<typeof PromotionActionType>;
39+
this.ProductActionType = ProductActionType as unknown as valueof<typeof ProductActionType>;
40+
3441
this.MPSideloadedKit = MPSideloadedKit;
3542

3643
if (typeof window !== 'undefined') {
@@ -65,7 +72,7 @@ function mParticle() {
6572
? Constants.DefaultInstance
6673
: instanceName
6774
).toLowerCase();
68-
var client = self._instances[instanceName];
75+
let client: IMParticleWebSDKInstance = self._instances[instanceName];
6976
if (client === undefined) {
7077
client = new mParticleInstance(instanceName);
7178
self._instances[instanceName] = client;
@@ -75,7 +82,7 @@ function mParticle() {
7582
};
7683

7784
this.getInstance = function getInstance(instanceName) {
78-
var client;
85+
let client: IMParticleWebSDKInstance;
7986
if (!instanceName) {
8087
instanceName = Constants.DefaultInstance;
8188
client = self._instances[instanceName];
@@ -480,11 +487,17 @@ function mParticle() {
480487
};
481488
}
482489

483-
var mparticleInstance = new mParticle();
490+
const mParticleManager = new mParticleInstanceManager();
484491

485492
if (typeof window !== 'undefined') {
486-
window.mParticle = mparticleInstance;
493+
// mParticle is the global object used to access the SDK and predates instance manager,
494+
// when mParticle was a singleton. We now support multiple instances. Calling methods
495+
// on mParticle directly will access the default instance, but mParticle can also be used
496+
// as the instance manager in self hosted mode.
497+
window.mParticle = mParticleManager;
498+
499+
// https://go.mparticle.com/work/SQDSDKS-5053
487500
window.mParticle._BatchValidator = new _BatchValidator();
488501
}
489502

490-
export default mparticleInstance;
503+
export default mParticleManager;

src/sdkRuntimeModels.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Validators from './validators';
1212
import { Dictionary, valueof } from './utils';
1313
import { IKitConfigs } from './configAPIClient';
1414
import { SDKConsentApi, SDKConsentState } from './consent';
15-
import { IMPSideloadedKit } from './sideloadedKit';
15+
import MPSideloadedKit from './sideloadedKit';
1616
import { ISessionManager } from './sessionManager';
1717
import { Kit, MPForwarder } from './forwarders.interfaces';
1818
import {
@@ -236,7 +236,7 @@ export interface IMParticleInstanceManager extends MParticleWebSDK {
236236
// Public Properties
237237
config: SDKInitConfig;
238238
isIOS?: boolean;
239-
MPSideloadedKit: IMPSideloadedKit;
239+
MPSideloadedKit: typeof MPSideloadedKit;
240240
// https://go.mparticle.com/work/SQDSDKS-7060
241241
sessionManager: Pick<ISessionManager, 'getSession'>;
242242
Store: IStore;

test/jest/sideloadedKit.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import MPSideloadedKit, { IMPSideloadedKit } from "../../src/sideloadedKit";
1+
import MPSideloadedKit from "../../src/sideloadedKit";
22
import { IMPSideloadedKitConstructor } from "../../src/sideloadedKit";
33
import { EventType, IdentityType } from "../../src/types";
44
import { UnregisteredKit } from '../../src/forwarders.interfaces';

test/src/tests-batchUploader_2.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Utils from './config/utils';
33
import { expect } from 'chai';
44
import _BatchValidator from '../../src/mockBatchCreator';
55
import fetchMock from 'fetch-mock/esm/client';
6-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
6+
import { IMParticleInstanceManager } from '../../src/sdkRuntimeModels';
77
import { CustomEvent } from '@mparticle/event-models';
88
const { fetchMockSuccess, waitForCondition, hasIdentifyReturned } = Utils;
99

test/src/tests-batchUploader_3.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import Utils from './config/utils';
44
import { expect } from 'chai';
55
import _BatchValidator from '../../src/mockBatchCreator';
66
import fetchMock from 'fetch-mock/esm/client';
7-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
87
import { ProductActionType } from '../../src/types';
8+
import { IMParticleInstanceManager } from '../../src/sdkRuntimeModels';
99
const { fetchMockSuccess, waitForCondition, hasIdentifyReturned } = Utils;
1010

1111
declare global {

test/src/tests-batchUploader_4.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import Utils from './config/utils';
55
import { expect } from 'chai';
66
import _BatchValidator from '../../src/mockBatchCreator';
77
import fetchMock from 'fetch-mock/esm/client';
8-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
98
import { ProductActionType } from '../../src/types';
9+
import { IMParticleInstanceManager } from '../../src/sdkRuntimeModels';
1010
const { fetchMockSuccess, waitForCondition, hasIdentifyReturned } = Utils;
1111

1212
declare global {

test/src/tests-beaconUpload.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { event0 } from '../fixtures/events';
66
import { batch1, batch2, batch3 } from '../fixtures/batches';
77
import _BatchValidator from '../../src/mockBatchCreator';
88
import Utils from './config/utils';
9-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
9+
import { IMParticleInstanceManager } from '../../src/sdkRuntimeModels';
1010
const { findEventFromRequest, findBatch, waitForCondition, fetchMockSuccess, hasIdentifyReturned } = Utils;
1111

1212
declare global {

test/src/tests-config-api-client.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import ConfigAPIClient from '../../src/configAPIClient';
66
import {
77
DataPlanConfig,
88
DataPlanResult,
9+
IMParticleInstanceManager,
910
SDKInitConfig,
1011
} from '../../src/sdkRuntimeModels';
11-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
1212

1313
declare global {
1414
interface Window {

test/src/tests-consent.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { urls, apiKey, MPConfig, testMPID } from './config/constants';
55
import { expect } from 'chai';
66
import { GDPRConsentState, PrivacyConsentState } from '@mparticle/web-sdk';
77
import { Dictionary } from '../../src/utils';
8-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
8+
import { IMParticleInstanceManager } from '../../src/sdkRuntimeModels';
99
const { hasIdentifyReturned, waitForCondition, fetchMockSuccess } = Utils;
1010

1111
declare global {

test/src/tests-cookie-syncing.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { urls, testMPID, MPConfig, v4LSKey, apiKey } from './config/constants';
55
import { IMParticleUser } from '../../src/identity-user-interfaces';
66
import { IPixelConfiguration } from '../../src/cookieSyncManager';
77
import { IConsentRules } from '../../src/consent';
8-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
8+
import { IMParticleInstanceManager } from '../../src/sdkRuntimeModels';
99
const { fetchMockSuccess, waitForCondition, hasIdentifyReturned } = Utils;
1010

1111
const { setLocalStorage, MockForwarder, getLocalStorage } = Utils;

test/src/tests-feature-flags.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { urls, apiKey,
77
MPConfig,
88
} from './config/constants';
99
import Utils from './config/utils';
10-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
10+
import { IMParticleInstanceManager } from '../../src/sdkRuntimeModels';
1111

1212
const { waitForCondition, fetchMockSuccess, deleteAllCookies } = Utils;
1313

test/src/tests-identities-attributes.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import Utils from './config/utils';
1010
import { AllUserAttributes, UserAttributesValue } from '@mparticle/web-sdk';
1111
import { UserAttributes } from '../../src/identity-user-interfaces';
1212
import { Batch, CustomEvent, UserAttributeChangeEvent } from '@mparticle/event-models';
13-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
14-
import { SDKProduct } from '../../src/sdkRuntimeModels';
13+
import { IMParticleInstanceManager, SDKProduct } from '../../src/sdkRuntimeModels';
1514
const {
1615
waitForCondition,
1716
fetchMockSuccess,

test/src/tests-identity.ts

+4-12
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
import {
1414
Callback,
1515
IdentityApiData,
16-
Product,
1716
UserIdentities,
1817
} from '@mparticle/web-sdk';
1918
import { IdentityCache } from '../../src/identity-utils';
@@ -27,7 +26,7 @@ import {
2726
IdentityResult,
2827
IdentityResultBody,
2928
} from '../../src/identity-user-interfaces';
30-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
29+
import { IMParticleInstanceManager, SDKProduct } from '../../src/sdkRuntimeModels';
3130

3231
const {
3332
setLocalStorage,
@@ -1803,8 +1802,6 @@ describe('identity', function() {
18031802
is_logged_in: false,
18041803
});
18051804

1806-
mParticle.identifyRequest = userIdentities1;
1807-
18081805
mParticle.init(apiKey, window.mParticle.config);
18091806

18101807
waitForCondition(() => mParticle.Identity?.getUsers().length === 4)
@@ -1904,8 +1901,6 @@ describe('identity', function() {
19041901
is_logged_in: false,
19051902
});
19061903

1907-
mParticle.identifyRequest = user1;
1908-
19091904
mParticle.init(apiKey, window.mParticle.config);
19101905

19111906
waitForCondition(hasIdentityCallInflightReturned)
@@ -2029,7 +2024,7 @@ describe('identity', function() {
20292024
mParticle.Identity.getCurrentUser().setUserAttribute('foo1', 'bar1');
20302025
expect(fetchMock.calls().length).to.equal(7);
20312026

2032-
const product1: Product = mParticle.eCommerce.createProduct(
2027+
const product1: SDKProduct = mParticle.eCommerce.createProduct(
20332028
'iPhone',
20342029
'12345',
20352030
'1000',
@@ -2237,8 +2232,6 @@ describe('identity', function() {
22372232
data.mpid3.ui[1].should.equal('3');
22382233
data.mpid4.ui[1].should.equal('4');
22392234

2240-
mParticle.identifyRequest = null;
2241-
22422235
done();
22432236
}).catch(done);
22442237
}).catch(done);
@@ -2459,7 +2452,6 @@ describe('identity', function() {
24592452
customerid: '123',
24602453
},
24612454
};
2462-
mParticle.identifyRequest = identityAPIRequest1;
24632455
mParticle.init(apiKey, window.mParticle.config);
24642456

24652457
waitForCondition(hasIdentifyReturned)
@@ -4799,7 +4791,7 @@ describe('identity', function() {
47994791
waitForCondition(hasIdentifyReturned)
48004792
.then(() => {
48014793

4802-
const product: Product = mParticle.eCommerce.createProduct(
4794+
const product: SDKProduct = mParticle.eCommerce.createProduct(
48034795
'iPhone',
48044796
'12345',
48054797
400
@@ -4831,7 +4823,7 @@ describe('identity', function() {
48314823
waitForCondition(hasIdentifyReturned)
48324824
.then(() => {
48334825

4834-
const product: Product = mParticle.eCommerce.createProduct(
4826+
const product: SDKProduct = mParticle.eCommerce.createProduct(
48354827
'iPhone',
48364828
'12345',
48374829
400

test/src/tests-identityApiClient.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ import Constants, {
1818
import IdentityAPIClient, { IIdentityApiClient } from '../../src/identityApiClient';
1919
import { IIdentityResponse } from '../../src/identity-user-interfaces';
2020
import Utils from './config/utils';
21-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
2221
import { IMParticleWebSDKInstance } from '../../src/mp-instance';
22+
import { IMParticleInstanceManager } from '../../src/sdkRuntimeModels';
2323
const { fetchMockSuccess } = Utils;
2424
const { HTTPCodes } = Constants;
2525

@@ -128,7 +128,7 @@ describe('Identity Api Client', () => {
128128

129129
const invokeCallbackSpy = sinon.spy();
130130

131-
const mpInstance: IMParticleInstanceManager = ({
131+
const mpInstance: IMParticleWebSDKInstance = ({
132132
Logger: {
133133
verbose: () => {},
134134
error: () => {},
@@ -147,7 +147,7 @@ describe('Identity Api Client', () => {
147147
identityCallInFlight: true,
148148
},
149149
_Persistence: {},
150-
} as unknown) as IMParticleInstanceManager;
150+
} as unknown) as IMParticleWebSDKInstance;
151151

152152
const identityApiClient: IIdentityApiClient = new IdentityAPIClient(
153153
mpInstance
@@ -302,7 +302,7 @@ describe('Identity Api Client', () => {
302302

303303
const callbackSpy = sinon.spy();
304304

305-
const mpInstance: IMParticleInstanceManager = ({
305+
const mpInstance: IMParticleWebSDKInstance = ({
306306
Logger: {
307307
verbose: () => {},
308308
error: () => {},
@@ -320,7 +320,7 @@ describe('Identity Api Client', () => {
320320
},
321321
},
322322
_Persistence: {},
323-
} as unknown) as IMParticleInstanceManager;;
323+
} as unknown) as IMParticleWebSDKInstance;;
324324

325325
const identityApiClient: IIdentityApiClient = new IdentityAPIClient(
326326
mpInstance
@@ -644,7 +644,7 @@ describe('Identity Api Client', () => {
644644
const verboseSpy = sinon.spy();
645645
const errorSpy = sinon.spy();
646646

647-
const mpInstance: IMParticleInstanceManager = ({
647+
const mpInstance: IMParticleWebSDKInstance = ({
648648
Logger: {
649649
verbose: (message) => verboseSpy(message),
650650
error: (message) => errorSpy(message),
@@ -662,7 +662,7 @@ describe('Identity Api Client', () => {
662662
},
663663
},
664664
_Persistence: {},
665-
} as unknown) as IMParticleInstanceManager;
665+
} as unknown) as IMParticleWebSDKInstance;
666666

667667
const identityApiClient: IIdentityApiClient = new IdentityAPIClient(
668668
mpInstance

test/src/tests-kit-blocking.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import sinon from 'sinon';
22
import { expect } from 'chai';
33
import { urls, apiKey, MPConfig, testMPID } from './config/constants';
4-
import { SDKEvent, SDKProductActionType, DataPlanResult, KitBlockerDataPlan } from '../../src/sdkRuntimeModels';
4+
import { SDKEvent, SDKProductActionType, DataPlanResult, KitBlockerDataPlan, IMParticleInstanceManager } from '../../src/sdkRuntimeModels';
55
import * as dataPlan from './dataPlan.json';
66
import Utils from './config/utils';
77
import KitBlocker from '../../src/kitBlocking';
88
import Types from '../../src/types';
99
import { DataPlanVersion } from '@mparticle/data-planning-models';
1010
import fetchMock from 'fetch-mock/esm/client';
11-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
1211
const { waitForCondition, fetchMockSuccess, hasIdentifyReturned } = Utils;
1312

1413
let forwarderDefaultConfiguration = Utils.forwarderDefaultConfiguration,

test/src/tests-legacy-alias-requests.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
workspaceCookieName,
1111
} from './config/constants';
1212
import { IAliasRequest } from '../../src/identity.interfaces';
13-
import { IMParticleInstanceManager } from '../../src/mparticle-instance-manager';
13+
import { IMParticleInstanceManager } from '../../src/sdkRuntimeModels';
1414

1515
const {
1616
setCookie,

0 commit comments

Comments
 (0)