@adtrackify/at-service-common 3.0.83 → 3.0.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/helpers/identity-cache-helper.d.ts +3 -1
- package/dist/cjs/helpers/identity-cache-helper.js +91 -13
- package/dist/cjs/helpers/identity-cache-helper.js.map +1 -1
- package/dist/esm/helpers/identity-cache-helper.d.ts +3 -1
- package/dist/esm/helpers/identity-cache-helper.js +89 -13
- package/dist/esm/helpers/identity-cache-helper.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import { EventIdentity } from '@adtrackify/at-tracking-event-types';
|
|
1
|
+
import { AdClickInfo, EventIdentity } from '@adtrackify/at-tracking-event-types';
|
|
2
2
|
import { IdentityCache } from '../services';
|
|
3
3
|
export declare const isIdentityCacheStale: (identityCache: IdentityCache, incomingIdentity: EventIdentity) => boolean;
|
|
4
|
+
export declare const isClickInfosStale: (cachedClick: AdClickInfo, incomingClick: AdClickInfo) => boolean;
|
|
5
|
+
export declare const hasNewIncomingClickInfo: (cachedClick?: AdClickInfo, incomingClick?: AdClickInfo) => boolean;
|
|
@@ -1,62 +1,96 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isIdentityCacheStale = void 0;
|
|
3
|
+
exports.hasNewIncomingClickInfo = exports.isClickInfosStale = exports.isIdentityCacheStale = void 0;
|
|
4
4
|
const at_shared_utils_1 = require("@adtrackify/at-shared-utils");
|
|
5
5
|
const logging_helper_1 = require("./logging-helper");
|
|
6
6
|
const isIdentityCacheStale = (identityCache, incomingIdentity) => {
|
|
7
7
|
try {
|
|
8
8
|
const cachedTraits = identityCache.response?.traits ?? {};
|
|
9
9
|
const incomingTraits = incomingIdentity?.traits ?? {};
|
|
10
|
+
const identityCacheStaleTracker = {
|
|
11
|
+
cachedTraits: cachedTraits,
|
|
12
|
+
incomingTraits: incomingTraits,
|
|
13
|
+
isUserIdsStale: false,
|
|
14
|
+
isIdsStale: false,
|
|
15
|
+
isEmailsStale: false,
|
|
16
|
+
isPhonesStale: false,
|
|
17
|
+
isShopifyYIdsStale: false,
|
|
18
|
+
isGendersStale: false,
|
|
19
|
+
isDobsStale: false,
|
|
20
|
+
isAddressesStale: false,
|
|
21
|
+
isClickInfosStale: false,
|
|
22
|
+
isIpAddressStale: false,
|
|
23
|
+
isUserAgentStale: false,
|
|
24
|
+
isCacheStale: false
|
|
25
|
+
};
|
|
10
26
|
const isNewUserIds = (0, at_shared_utils_1.hasNewTrait)(cachedTraits?.userIds ?? [], incomingTraits?.userIds ?? []);
|
|
11
27
|
if (isNewUserIds) {
|
|
12
28
|
logging_helper_1.Logger.debug('identity cache miss - userIds changed', { cachedTraits, incomingTraits });
|
|
13
|
-
|
|
29
|
+
identityCacheStaleTracker.isUserIdsStale = true;
|
|
30
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
14
31
|
}
|
|
15
32
|
const isNewIds = (0, at_shared_utils_1.hasNewTrait)(cachedTraits?.ids ?? [], incomingTraits?.ids ?? []);
|
|
16
33
|
if (isNewIds) {
|
|
17
34
|
logging_helper_1.Logger.debug('identity cache miss - ids changed', { cachedTraits, incomingTraits });
|
|
18
|
-
|
|
35
|
+
identityCacheStaleTracker.isIdsStale = true;
|
|
36
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
19
37
|
}
|
|
20
38
|
const isNewEmails = (0, at_shared_utils_1.hasNewTrait)(cachedTraits?.emails ?? [], incomingTraits?.emails ?? []);
|
|
21
39
|
if (isNewEmails) {
|
|
22
40
|
logging_helper_1.Logger.debug('identity cache miss - emails changed', { cachedTraits, incomingTraits });
|
|
23
|
-
|
|
41
|
+
identityCacheStaleTracker.isEmailsStale = true;
|
|
42
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
24
43
|
}
|
|
25
44
|
const isNewPhones = (0, at_shared_utils_1.hasNewTrait)(cachedTraits?.phones ?? [], incomingTraits?.phones ?? []);
|
|
26
45
|
if (isNewPhones) {
|
|
27
46
|
logging_helper_1.Logger.debug('identity cache miss - phones changed', { cachedTraits, incomingTraits });
|
|
28
|
-
|
|
47
|
+
identityCacheStaleTracker.isPhonesStale = true;
|
|
48
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
29
49
|
}
|
|
30
50
|
const isNewShopifyYIds = (0, at_shared_utils_1.hasNewTrait)(cachedTraits?.shopifyYIds ?? [], incomingTraits?.shopifyYIds ?? []);
|
|
31
51
|
if (isNewShopifyYIds) {
|
|
32
52
|
logging_helper_1.Logger.debug('identity cache miss - shopify Y ids changed', { cachedTraits, incomingTraits });
|
|
33
|
-
|
|
53
|
+
identityCacheStaleTracker.isShopifyYIdsStale = true;
|
|
54
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
34
55
|
}
|
|
35
56
|
const isNewGenders = (0, at_shared_utils_1.hasNewTrait)(cachedTraits?.genders ?? [], incomingTraits?.genders ?? []);
|
|
36
57
|
if (isNewGenders) {
|
|
37
58
|
logging_helper_1.Logger.debug('identity cache miss - genders changed', { cachedTraits, incomingTraits });
|
|
38
|
-
|
|
59
|
+
identityCacheStaleTracker.isGendersStale = true;
|
|
60
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
39
61
|
}
|
|
40
62
|
const isNewDobs = (0, at_shared_utils_1.hasNewTrait)(cachedTraits?.dobs ?? [], incomingTraits?.dobs ?? []);
|
|
41
63
|
if (isNewDobs) {
|
|
42
64
|
logging_helper_1.Logger.debug('identity cache miss - dobs changed', { cachedTraits, incomingTraits });
|
|
43
|
-
|
|
65
|
+
identityCacheStaleTracker.isDobsStale = true;
|
|
66
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
44
67
|
}
|
|
45
68
|
const isNewAddress = (0, at_shared_utils_1.hasNewAddress)(cachedTraits?.addresses ?? [], incomingTraits?.addresses ?? []);
|
|
46
69
|
if (isNewAddress) {
|
|
47
70
|
logging_helper_1.Logger.debug('identity cache miss - address changed', { cachedTraits, incomingTraits });
|
|
48
|
-
|
|
71
|
+
identityCacheStaleTracker.isAddressesStale = true;
|
|
72
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
49
73
|
}
|
|
50
|
-
const isNewClick = (0,
|
|
74
|
+
const isNewClick = (0, exports.isClickInfosStale)(cachedTraits?.click ?? {}, incomingTraits?.click ?? {});
|
|
51
75
|
if (isNewClick) {
|
|
52
76
|
logging_helper_1.Logger.debug('identity cache miss - clickInfos changed', { cachedTraits, incomingTraits });
|
|
53
|
-
|
|
77
|
+
identityCacheStaleTracker.isClickInfosStale = true;
|
|
78
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
54
79
|
}
|
|
55
80
|
if ((incomingTraits?.ipAddress && cachedTraits?.ipAddress !== incomingTraits?.ipAddress) || (incomingTraits?.userAgent && cachedTraits?.userAgent !== incomingTraits?.userAgent)) {
|
|
56
81
|
logging_helper_1.Logger.debug('identity cache miss - ip/userAgent changed', { cachedTraits, incomingTraits });
|
|
57
|
-
|
|
82
|
+
identityCacheStaleTracker.isIpAddressStale = true;
|
|
83
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
58
84
|
}
|
|
59
|
-
|
|
85
|
+
if (incomingTraits?.userAgent && cachedTraits?.userAgent !== incomingTraits?.userAgent) {
|
|
86
|
+
logging_helper_1.Logger.debug('identity cache miss - userAgent changed', { cachedTraits, incomingTraits });
|
|
87
|
+
identityCacheStaleTracker.isUserAgentStale = true;
|
|
88
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
89
|
+
}
|
|
90
|
+
if (identityCacheStaleTracker.isCacheStale) {
|
|
91
|
+
logging_helper_1.Logger.warn('identity cache miss - cache stale', { identityCacheStaleTracker });
|
|
92
|
+
}
|
|
93
|
+
return identityCacheStaleTracker.isCacheStale;
|
|
60
94
|
}
|
|
61
95
|
catch (err) {
|
|
62
96
|
logging_helper_1.Logger.error('Error while checking if identity cache is stale', { err });
|
|
@@ -64,4 +98,48 @@ const isIdentityCacheStale = (identityCache, incomingIdentity) => {
|
|
|
64
98
|
}
|
|
65
99
|
};
|
|
66
100
|
exports.isIdentityCacheStale = isIdentityCacheStale;
|
|
101
|
+
const isClickInfosStale = (cachedClick, incomingClick) => {
|
|
102
|
+
const cleanedCachedClick = (0, at_shared_utils_1.removeEmptyFields)(cachedClick);
|
|
103
|
+
const cleanedIncomingClick = (0, at_shared_utils_1.removeEmptyFields)(incomingClick);
|
|
104
|
+
const incomingKeys = Object.keys(cleanedIncomingClick);
|
|
105
|
+
const clickInfoStaleTracker = {
|
|
106
|
+
cleanedCachedClick,
|
|
107
|
+
cleanedIncomingClick,
|
|
108
|
+
isClickInfosStale: false,
|
|
109
|
+
staleKeys: []
|
|
110
|
+
};
|
|
111
|
+
incomingKeys.forEach(key => {
|
|
112
|
+
if (key === 'googleClientInfos') {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
const cachedClickValue = cleanedCachedClick?.[key];
|
|
117
|
+
const incomingClickValue = cleanedIncomingClick?.[key];
|
|
118
|
+
if ((incomingClickValue && !cachedClickValue)
|
|
119
|
+
|| incomingClickValue !== cachedClickValue) {
|
|
120
|
+
clickInfoStaleTracker.isClickInfosStale = true;
|
|
121
|
+
clickInfoStaleTracker.staleKeys.push(key);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
if (clickInfoStaleTracker.isClickInfosStale) {
|
|
126
|
+
logging_helper_1.Logger.warn('identity cache miss - clickInfos changed', { clickInfoStaleTracker });
|
|
127
|
+
}
|
|
128
|
+
return clickInfoStaleTracker.isClickInfosStale;
|
|
129
|
+
};
|
|
130
|
+
exports.isClickInfosStale = isClickInfosStale;
|
|
131
|
+
const hasNewIncomingClickInfo = (cachedClick = {}, incomingClick = {}) => {
|
|
132
|
+
const cleanedCachedClick = (0, at_shared_utils_1.removeEmptyFields)(cachedClick);
|
|
133
|
+
const cleanedIncomingClick = (0, at_shared_utils_1.removeEmptyFields)(incomingClick);
|
|
134
|
+
const incomingKeys = Object.keys(cleanedIncomingClick);
|
|
135
|
+
return !incomingKeys.every((key) => {
|
|
136
|
+
if (key === 'googleClientInfos') {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
const cachedClickValue = cleanedCachedClick[key];
|
|
140
|
+
const incomingClickValue = cleanedIncomingClick[key];
|
|
141
|
+
return incomingClickValue === cachedClickValue;
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
exports.hasNewIncomingClickInfo = hasNewIncomingClickInfo;
|
|
67
145
|
//# sourceMappingURL=identity-cache-helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-cache-helper.js","sourceRoot":"","sources":["../../../src/helpers/identity-cache-helper.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"identity-cache-helper.js","sourceRoot":"","sources":["../../../src/helpers/identity-cache-helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import { EventIdentity } from '@adtrackify/at-tracking-event-types';
|
|
1
|
+
import { AdClickInfo, EventIdentity } from '@adtrackify/at-tracking-event-types';
|
|
2
2
|
import { IdentityCache } from '../services';
|
|
3
3
|
export declare const isIdentityCacheStale: (identityCache: IdentityCache, incomingIdentity: EventIdentity) => boolean;
|
|
4
|
+
export declare const isClickInfosStale: (cachedClick: AdClickInfo, incomingClick: AdClickInfo) => boolean;
|
|
5
|
+
export declare const hasNewIncomingClickInfo: (cachedClick?: AdClickInfo, incomingClick?: AdClickInfo) => boolean;
|
|
@@ -1,63 +1,139 @@
|
|
|
1
|
-
import { hasNewTrait, hasNewAddress,
|
|
1
|
+
import { hasNewTrait, hasNewAddress, removeEmptyFields } from '@adtrackify/at-shared-utils';
|
|
2
2
|
import { Logger } from './logging-helper';
|
|
3
3
|
export const isIdentityCacheStale = (identityCache, incomingIdentity) => {
|
|
4
4
|
try {
|
|
5
5
|
const cachedTraits = identityCache.response?.traits ?? {};
|
|
6
6
|
const incomingTraits = incomingIdentity?.traits ?? {};
|
|
7
|
+
const identityCacheStaleTracker = {
|
|
8
|
+
cachedTraits: cachedTraits,
|
|
9
|
+
incomingTraits: incomingTraits,
|
|
10
|
+
isUserIdsStale: false,
|
|
11
|
+
isIdsStale: false,
|
|
12
|
+
isEmailsStale: false,
|
|
13
|
+
isPhonesStale: false,
|
|
14
|
+
isShopifyYIdsStale: false,
|
|
15
|
+
isGendersStale: false,
|
|
16
|
+
isDobsStale: false,
|
|
17
|
+
isAddressesStale: false,
|
|
18
|
+
isClickInfosStale: false,
|
|
19
|
+
isIpAddressStale: false,
|
|
20
|
+
isUserAgentStale: false,
|
|
21
|
+
isCacheStale: false
|
|
22
|
+
};
|
|
7
23
|
const isNewUserIds = hasNewTrait(cachedTraits?.userIds ?? [], incomingTraits?.userIds ?? []);
|
|
8
24
|
if (isNewUserIds) {
|
|
9
25
|
Logger.debug('identity cache miss - userIds changed', { cachedTraits, incomingTraits });
|
|
10
|
-
|
|
26
|
+
identityCacheStaleTracker.isUserIdsStale = true;
|
|
27
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
11
28
|
}
|
|
12
29
|
const isNewIds = hasNewTrait(cachedTraits?.ids ?? [], incomingTraits?.ids ?? []);
|
|
13
30
|
if (isNewIds) {
|
|
14
31
|
Logger.debug('identity cache miss - ids changed', { cachedTraits, incomingTraits });
|
|
15
|
-
|
|
32
|
+
identityCacheStaleTracker.isIdsStale = true;
|
|
33
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
16
34
|
}
|
|
17
35
|
const isNewEmails = hasNewTrait(cachedTraits?.emails ?? [], incomingTraits?.emails ?? []);
|
|
18
36
|
if (isNewEmails) {
|
|
19
37
|
Logger.debug('identity cache miss - emails changed', { cachedTraits, incomingTraits });
|
|
20
|
-
|
|
38
|
+
identityCacheStaleTracker.isEmailsStale = true;
|
|
39
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
21
40
|
}
|
|
22
41
|
const isNewPhones = hasNewTrait(cachedTraits?.phones ?? [], incomingTraits?.phones ?? []);
|
|
23
42
|
if (isNewPhones) {
|
|
24
43
|
Logger.debug('identity cache miss - phones changed', { cachedTraits, incomingTraits });
|
|
25
|
-
|
|
44
|
+
identityCacheStaleTracker.isPhonesStale = true;
|
|
45
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
26
46
|
}
|
|
27
47
|
const isNewShopifyYIds = hasNewTrait(cachedTraits?.shopifyYIds ?? [], incomingTraits?.shopifyYIds ?? []);
|
|
28
48
|
if (isNewShopifyYIds) {
|
|
29
49
|
Logger.debug('identity cache miss - shopify Y ids changed', { cachedTraits, incomingTraits });
|
|
30
|
-
|
|
50
|
+
identityCacheStaleTracker.isShopifyYIdsStale = true;
|
|
51
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
31
52
|
}
|
|
32
53
|
const isNewGenders = hasNewTrait(cachedTraits?.genders ?? [], incomingTraits?.genders ?? []);
|
|
33
54
|
if (isNewGenders) {
|
|
34
55
|
Logger.debug('identity cache miss - genders changed', { cachedTraits, incomingTraits });
|
|
35
|
-
|
|
56
|
+
identityCacheStaleTracker.isGendersStale = true;
|
|
57
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
36
58
|
}
|
|
37
59
|
const isNewDobs = hasNewTrait(cachedTraits?.dobs ?? [], incomingTraits?.dobs ?? []);
|
|
38
60
|
if (isNewDobs) {
|
|
39
61
|
Logger.debug('identity cache miss - dobs changed', { cachedTraits, incomingTraits });
|
|
40
|
-
|
|
62
|
+
identityCacheStaleTracker.isDobsStale = true;
|
|
63
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
41
64
|
}
|
|
42
65
|
const isNewAddress = hasNewAddress(cachedTraits?.addresses ?? [], incomingTraits?.addresses ?? []);
|
|
43
66
|
if (isNewAddress) {
|
|
44
67
|
Logger.debug('identity cache miss - address changed', { cachedTraits, incomingTraits });
|
|
45
|
-
|
|
68
|
+
identityCacheStaleTracker.isAddressesStale = true;
|
|
69
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
46
70
|
}
|
|
47
|
-
const isNewClick =
|
|
71
|
+
const isNewClick = isClickInfosStale(cachedTraits?.click ?? {}, incomingTraits?.click ?? {});
|
|
48
72
|
if (isNewClick) {
|
|
49
73
|
Logger.debug('identity cache miss - clickInfos changed', { cachedTraits, incomingTraits });
|
|
50
|
-
|
|
74
|
+
identityCacheStaleTracker.isClickInfosStale = true;
|
|
75
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
51
76
|
}
|
|
52
77
|
if ((incomingTraits?.ipAddress && cachedTraits?.ipAddress !== incomingTraits?.ipAddress) || (incomingTraits?.userAgent && cachedTraits?.userAgent !== incomingTraits?.userAgent)) {
|
|
53
78
|
Logger.debug('identity cache miss - ip/userAgent changed', { cachedTraits, incomingTraits });
|
|
54
|
-
|
|
79
|
+
identityCacheStaleTracker.isIpAddressStale = true;
|
|
80
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
55
81
|
}
|
|
56
|
-
|
|
82
|
+
if (incomingTraits?.userAgent && cachedTraits?.userAgent !== incomingTraits?.userAgent) {
|
|
83
|
+
Logger.debug('identity cache miss - userAgent changed', { cachedTraits, incomingTraits });
|
|
84
|
+
identityCacheStaleTracker.isUserAgentStale = true;
|
|
85
|
+
identityCacheStaleTracker.isCacheStale = true;
|
|
86
|
+
}
|
|
87
|
+
if (identityCacheStaleTracker.isCacheStale) {
|
|
88
|
+
Logger.warn('identity cache miss - cache stale', { identityCacheStaleTracker });
|
|
89
|
+
}
|
|
90
|
+
return identityCacheStaleTracker.isCacheStale;
|
|
57
91
|
}
|
|
58
92
|
catch (err) {
|
|
59
93
|
Logger.error('Error while checking if identity cache is stale', { err });
|
|
60
94
|
return true;
|
|
61
95
|
}
|
|
62
96
|
};
|
|
97
|
+
export const isClickInfosStale = (cachedClick, incomingClick) => {
|
|
98
|
+
const cleanedCachedClick = removeEmptyFields(cachedClick);
|
|
99
|
+
const cleanedIncomingClick = removeEmptyFields(incomingClick);
|
|
100
|
+
const incomingKeys = Object.keys(cleanedIncomingClick);
|
|
101
|
+
const clickInfoStaleTracker = {
|
|
102
|
+
cleanedCachedClick,
|
|
103
|
+
cleanedIncomingClick,
|
|
104
|
+
isClickInfosStale: false,
|
|
105
|
+
staleKeys: []
|
|
106
|
+
};
|
|
107
|
+
incomingKeys.forEach(key => {
|
|
108
|
+
if (key === 'googleClientInfos') {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const cachedClickValue = cleanedCachedClick?.[key];
|
|
113
|
+
const incomingClickValue = cleanedIncomingClick?.[key];
|
|
114
|
+
if ((incomingClickValue && !cachedClickValue)
|
|
115
|
+
|| incomingClickValue !== cachedClickValue) {
|
|
116
|
+
clickInfoStaleTracker.isClickInfosStale = true;
|
|
117
|
+
clickInfoStaleTracker.staleKeys.push(key);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
if (clickInfoStaleTracker.isClickInfosStale) {
|
|
122
|
+
Logger.warn('identity cache miss - clickInfos changed', { clickInfoStaleTracker });
|
|
123
|
+
}
|
|
124
|
+
return clickInfoStaleTracker.isClickInfosStale;
|
|
125
|
+
};
|
|
126
|
+
export const hasNewIncomingClickInfo = (cachedClick = {}, incomingClick = {}) => {
|
|
127
|
+
const cleanedCachedClick = removeEmptyFields(cachedClick);
|
|
128
|
+
const cleanedIncomingClick = removeEmptyFields(incomingClick);
|
|
129
|
+
const incomingKeys = Object.keys(cleanedIncomingClick);
|
|
130
|
+
return !incomingKeys.every((key) => {
|
|
131
|
+
if (key === 'googleClientInfos') {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
const cachedClickValue = cleanedCachedClick[key];
|
|
135
|
+
const incomingClickValue = cleanedIncomingClick[key];
|
|
136
|
+
return incomingClickValue === cachedClickValue;
|
|
137
|
+
});
|
|
138
|
+
};
|
|
63
139
|
//# sourceMappingURL=identity-cache-helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-cache-helper.js","sourceRoot":"","sources":["../../../src/helpers/identity-cache-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"identity-cache-helper.js","sourceRoot":"","sources":["../../../src/helpers/identity-cache-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAG5F,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,aAA4B,EAAE,gBAA+B,EAAE,EAAE;IACpG,IAAI;QACF,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC;QAC1D,MAAM,cAAc,GAAG,gBAAgB,EAAE,MAAM,IAAI,EAAE,CAAC;QACtD,MAAM,yBAAyB,GAAG;YAChC,YAAY,EAAE,YAAY;YAC1B,cAAc,EAAE,cAAc;YAC9B,cAAc,EAAE,KAAK;YACrB,UAAU,EAAE,KAAK;YACjB,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,KAAK;YACpB,kBAAkB,EAAE,KAAK;YACzB,cAAc,EAAE,KAAK;YACrB,WAAW,EAAE,KAAK;YAClB,gBAAgB,EAAE,KAAK;YACvB,iBAAiB,EAAE,KAAK;YACxB,gBAAgB,EAAE,KAAK;YACvB,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,KAAK;SACpB,CAAA;QAED,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,EAAE,OAAO,IAAI,EAAE,EAAE,cAAc,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7F,IAAI,YAAY,EAAE;YAChB,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YACxF,yBAAyB,CAAC,cAAc,GAAG,IAAI,CAAA;YAC/C,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QACD,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,QAAQ,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YACpF,yBAAyB,CAAC,UAAU,GAAG,IAAI,CAAC;YAC5C,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QACD,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,EAAE,MAAM,IAAI,EAAE,EAAE,cAAc,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;QAC1F,IAAI,WAAW,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YACvF,yBAAyB,CAAC,aAAa,GAAG,IAAI,CAAC;YAC/C,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QACD,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,EAAE,MAAM,IAAI,EAAE,EAAE,cAAc,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;QAC1F,IAAI,WAAW,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YACvF,yBAAyB,CAAC,aAAa,GAAG,IAAI,CAAC;YAC/C,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QACD,MAAM,gBAAgB,GAAG,WAAW,CAAC,YAAY,EAAE,WAAW,IAAI,EAAE,EAAE,cAAc,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;QACzG,IAAI,gBAAgB,EAAE;YACpB,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YAC9F,yBAAyB,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACpD,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QACD,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,EAAE,OAAO,IAAI,EAAE,EAAE,cAAc,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7F,IAAI,YAAY,EAAE;YAChB,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YACxF,yBAAyB,CAAC,cAAc,GAAG,IAAI,CAAC;YAChD,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QACD,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,EAAE,IAAI,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACpF,IAAI,SAAS,EAAE;YACb,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YACrF,yBAAyB,CAAC,WAAW,GAAG,IAAI,CAAC;YAC7C,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QACD,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,EAAE,SAAS,IAAI,EAAE,EAAE,cAAc,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;QACnG,IAAI,YAAY,EAAE;YAChB,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YACxF,yBAAyB,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAClD,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC7F,IAAI,UAAU,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YAC3F,yBAAyB,CAAC,iBAAiB,GAAG,IAAI,CAAC;YACnD,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QACD,IAAI,CAAC,cAAc,EAAE,SAAS,IAAI,YAAY,EAAE,SAAS,KAAK,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,IAAI,YAAY,EAAE,SAAS,KAAK,cAAc,EAAE,SAAS,CAAC,EAAE;YAChL,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YAC7F,yBAAyB,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAClD,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QACD,IAAI,cAAc,EAAE,SAAS,IAAI,YAAY,EAAE,SAAS,KAAK,cAAc,EAAE,SAAS,EAAE;YACtF,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YAC1F,yBAAyB,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAClD,yBAAyB,CAAC,YAAY,GAAG,IAAI,CAAC;SAC/C;QACD,IAAI,yBAAyB,CAAC,YAAY,EAAE;YAC1C,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,yBAAyB,EAAE,CAAC,CAAC;SACjF;QACD,OAAO,yBAAyB,CAAC,YAAY,CAAC;KAC/C;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,CAAC,KAAK,CAAC,iDAAiD,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;KACb;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAwB,EAAE,aAA0B,EAAE,EAAE;IACxF,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACvD,MAAM,qBAAqB,GAAG;QAC5B,kBAAkB;QAClB,oBAAoB;QACpB,iBAAiB,EAAE,KAAK;QACxB,SAAS,EAAE,EAAc;KAC1B,CAAA;IACD,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACzB,IAAI,GAAG,KAAK,mBAAmB,EAAE;YAC/B,OAAO,IAAI,CAAC;SACb;aAAM;YACL,MAAM,gBAAgB,GAAI,kBAA0B,EAAE,CAAC,GAAG,CAAC,CAAC;YAC5D,MAAM,kBAAkB,GAAI,oBAA4B,EAAE,CAAC,GAAG,CAAC,CAAC;YAChE,IAAI,CAAC,kBAAkB,IAAI,CAAC,gBAAgB,CAAC;mBACxC,kBAAkB,KAAK,gBAAgB,EAAE;gBAC5C,qBAAqB,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAC/C,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC3C;SACF;IACH,CAAC,CAAC,CAAA;IACF,IAAI,qBAAqB,CAAC,iBAAiB,EAAE;QAC3C,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC;KACpF;IACD,OAAO,qBAAqB,CAAC,iBAAiB,CAAC;AACjD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,cAA2B,EAAE,EAAE,gBAA6B,EAAE,EAAW,EAAE;IACjH,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACvD,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACjC,IAAI,GAAG,KAAK,mBAAmB,EAAE;YAC/B,OAAO,IAAI,CAAC;SACb;QACD,MAAM,gBAAgB,GAAI,kBAA0B,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,kBAAkB,GAAI,oBAA4B,CAAC,GAAG,CAAC,CAAC;QAC9D,OAAO,kBAAkB,KAAK,gBAAgB,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAA"}
|