diff --git a/README.md b/README.md index 4bac227..dc19f2a 100644 --- a/README.md +++ b/README.md @@ -201,6 +201,19 @@ You can set your own regexp if you need to : }), ```` + #### Mask IDs from url paths + +This can be combined with idsRegExp + +`/project/12981/feature` becomes `/project/XXXXX/feature` +````ts +Angulartics2Module.forRoot({ + pageTracking: { + maskIds: true, + } +}), +```` + #### Remove Query Params from url paths This can be combined with clearIds and idsRegExp diff --git a/src/lib/angulartics2-config.ts b/src/lib/angulartics2-config.ts index 7987d33..2a9a080 100644 --- a/src/lib/angulartics2-config.ts +++ b/src/lib/angulartics2-config.ts @@ -28,6 +28,8 @@ export interface PageTrackingSettings { excludedRoutes: (string | RegExp)[]; /** drop ids from url `/sections/123/pages/456` -> `/sections/pages` */ clearIds: boolean; + /** mask ids of url `/sections/123/pages/456` -> `/sections/XXXXX/pages/XXXXX` */ + maskIds: boolean; /** drop contents of url after hash marker `/callback#authcode=1234` -> `/callback` */ clearHash: boolean; /** drop query params from url `/sections/123/pages?param=456¶m2=789` -> `/sections/123/pages` */ @@ -52,6 +54,7 @@ export class DefaultConfig implements Angulartics2Settings { basePath: '', excludedRoutes: [], clearIds: false, + maskIds: false, clearHash: false, clearQueryParams: false, idsRegExp: diff --git a/src/lib/angulartics2-core.ts b/src/lib/angulartics2-core.ts index 6ab522b..930c0ed 100644 --- a/src/lib/angulartics2-core.ts +++ b/src/lib/angulartics2-core.ts @@ -81,19 +81,23 @@ export class Angulartics2 { protected clearUrl(url: string): string { if ( this.settings.pageTracking.clearIds || + this.settings.pageTracking.maskIds || this.settings.pageTracking.clearQueryParams || this.settings.pageTracking.clearHash ) { - return url + const newUrl = url .split('/') .map(part => (this.settings.pageTracking.clearQueryParams ? part.split('?')[0] : part)) - .map(part => (this.settings.pageTracking.clearHash ? part.split('#')[0] : part)) - .filter( - part => - !this.settings.pageTracking.clearIds || - !part.match(this.settings.pageTracking.idsRegExp), - ) - .join('/'); + .map(part => (this.settings.pageTracking.clearHash ? part.split('#')[0] : part)); + + if (this.settings.pageTracking.clearIds) { + return newUrl.filter(part => !part.match(this.settings.pageTracking.idsRegExp)).join('/'); + } else if (this.settings.pageTracking.maskIds) { + return newUrl + .map(part => part.replace(this.settings.pageTracking.idsRegExp, 'XXXXX')) + .join('/'); + } + return newUrl.join('/'); } return url; } diff --git a/src/lib/angulartics2.spec.ts b/src/lib/angulartics2.spec.ts index 3c5b4e5..de40c9d 100644 --- a/src/lib/angulartics2.spec.ts +++ b/src/lib/angulartics2.spec.ts @@ -316,6 +316,43 @@ describe('angulartics2', () => { ), )); + it('should mask ids and uuids from url if maskIds is true', fakeAsync( + inject( + [Router, Location, Angulartics2], + (router: Router, location: Location, angulartics2: Angulartics2) => { + fixture = createRootWithRouter(router, RootCmp); + angulartics2.pageTrack.subscribe((x: any) => EventSpy(x)); + angulartics2.settings.pageTracking.maskIds = true; + (location as SpyLocation).simulateUrlPop( + '/0sections0/01234567-9ABC-DEF0-1234-56789ABCDEF0/pages?param=456', + ); + advance(fixture); + expect(EventSpy).toHaveBeenCalledWith({ + path: '/0sections0/XXXXX/pages?param=456', + }); + }, + ), + )); + + it('should mask ids using custom regex if idsRegExp is set', fakeAsync( + inject( + [Router, Location, Angulartics2], + (router: Router, location: Location, angulartics2: Angulartics2) => { + fixture = createRootWithRouter(router, RootCmp); + angulartics2.pageTrack.subscribe((x: any) => EventSpy(x)); + angulartics2.settings.pageTracking.maskIds = true; + angulartics2.settings.pageTracking.idsRegExp = /^[a-z]\d+$/; + (location as SpyLocation).simulateUrlPop( + '/0sections0/a01/pages/page/2/summary?param=456', + ); + advance(fixture); + expect(EventSpy).toHaveBeenCalledWith({ + path: '/0sections0/XXXXX/pages/page/2/summary?param=456', + }); + }, + ), + )); + it('should remove hash if clearHash is set', fakeAsync( inject( [Router, Location, Angulartics2],