@adtrackify/at-service-common 3.18.15 → 3.18.17
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/__tests__/helpers/acuity-helper.spec.js +4 -1
- package/dist/cjs/__tests__/helpers/acuity-helper.spec.js.map +1 -1
- package/dist/cjs/__tests__/libs/contacts.spec.js +7 -3
- package/dist/cjs/__tests__/libs/contacts.spec.js.map +1 -1
- package/dist/cjs/__tests__/services/email-verification/contact-email-verification-service.spec.js +94 -0
- package/dist/cjs/__tests__/services/email-verification/contact-email-verification-service.spec.js.map +1 -0
- package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.js +7 -2
- package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.js.map +1 -1
- package/dist/cjs/helpers/acuity-helper.js.map +1 -1
- package/dist/cjs/libs/contacts.js +53 -33
- package/dist/cjs/libs/contacts.js.map +1 -1
- package/dist/cjs/libs/emails.js +3 -0
- package/dist/cjs/libs/emails.js.map +1 -1
- package/dist/cjs/services/email-verification/contact-email-verification-service.d.ts +7 -0
- package/dist/cjs/services/email-verification/contact-email-verification-service.js +102 -0
- package/dist/cjs/services/email-verification/contact-email-verification-service.js.map +1 -0
- package/dist/cjs/services/email-verification/email-verification-service.d.ts +4 -2
- package/dist/cjs/services/email-verification/email-verification-service.js +71 -32
- package/dist/cjs/services/email-verification/email-verification-service.js.map +1 -1
- package/dist/cjs/services/email-verification/index.d.ts +1 -1
- package/dist/cjs/services/email-verification/index.js +1 -1
- package/dist/cjs/services/email-verification/index.js.map +1 -1
- package/dist/esm/__tests__/helpers/acuity-helper.spec.js +5 -2
- package/dist/esm/__tests__/helpers/acuity-helper.spec.js.map +1 -1
- package/dist/esm/__tests__/libs/contacts.spec.js +8 -4
- package/dist/esm/__tests__/libs/contacts.spec.js.map +1 -1
- package/dist/esm/__tests__/services/email-verification/contact-email-verification-service.spec.js +92 -0
- package/dist/esm/__tests__/services/email-verification/contact-email-verification-service.spec.js.map +1 -0
- package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.js +7 -2
- package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.js.map +1 -1
- package/dist/esm/helpers/acuity-helper.js +1 -1
- package/dist/esm/helpers/acuity-helper.js.map +1 -1
- package/dist/esm/libs/contacts.js +53 -33
- package/dist/esm/libs/contacts.js.map +1 -1
- package/dist/esm/libs/emails.js +3 -0
- package/dist/esm/libs/emails.js.map +1 -1
- package/dist/esm/services/email-verification/contact-email-verification-service.d.ts +7 -0
- package/dist/esm/services/email-verification/contact-email-verification-service.js +98 -0
- package/dist/esm/services/email-verification/contact-email-verification-service.js.map +1 -0
- package/dist/esm/services/email-verification/email-verification-service.d.ts +4 -2
- package/dist/esm/services/email-verification/email-verification-service.js +71 -32
- package/dist/esm/services/email-verification/email-verification-service.js.map +1 -1
- package/dist/esm/services/email-verification/index.d.ts +1 -1
- package/dist/esm/services/email-verification/index.js +1 -1
- package/dist/esm/services/email-verification/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/__tests__/services/email-verification/contact-email-verifier.spec.js +0 -77
- package/dist/cjs/__tests__/services/email-verification/contact-email-verifier.spec.js.map +0 -1
- package/dist/cjs/services/email-verification/contact-email-verifier.d.ts +0 -4
- package/dist/cjs/services/email-verification/contact-email-verifier.js +0 -61
- package/dist/cjs/services/email-verification/contact-email-verifier.js.map +0 -1
- package/dist/esm/__tests__/services/email-verification/contact-email-verifier.spec.js +0 -75
- package/dist/esm/__tests__/services/email-verification/contact-email-verifier.spec.js.map +0 -1
- package/dist/esm/services/email-verification/contact-email-verifier.d.ts +0 -4
- package/dist/esm/services/email-verification/contact-email-verifier.js +0 -56
- package/dist/esm/services/email-verification/contact-email-verifier.js.map +0 -1
- /package/dist/cjs/__tests__/services/email-verification/{contact-email-verifier.spec.d.ts → contact-email-verification-service.spec.d.ts} +0 -0
- /package/dist/esm/__tests__/services/email-verification/{contact-email-verifier.spec.d.ts → contact-email-verification-service.spec.d.ts} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contact-email-verifier.spec.js","sourceRoot":"","sources":["../../../../../src/__tests__/services/email-verification/contact-email-verifier.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { EmailableVerifyEmailResponse, ThirdPartyContact } from '@adtrackify/at-tracking-event-types';
|
|
2
|
-
import type { EmailVerificationService } from './email-verification-service.js';
|
|
3
|
-
export declare const verifyContactEmail: (contact: ThirdPartyContact, email: string, emailVerificationService: EmailVerificationService, forceVerify?: boolean) => Promise<EmailableVerifyEmailResponse | null>;
|
|
4
|
-
export declare const verifyContactsEmail: (contacts: ThirdPartyContact[], emailVerificationService: EmailVerificationService) => Promise<ThirdPartyContact[] | null>;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.verifyContactsEmail = exports.verifyContactEmail = void 0;
|
|
4
|
-
const at_tracking_event_types_1 = require("@adtrackify/at-tracking-event-types");
|
|
5
|
-
const helpers_1 = require("../../helpers");
|
|
6
|
-
const emails_js_1 = require("../../libs/emails.js");
|
|
7
|
-
const verifyContactEmail = async (contact, email, emailVerificationService, forceVerify = false) => {
|
|
8
|
-
try {
|
|
9
|
-
if (!(0, emails_js_1.validateEmail)(email)) {
|
|
10
|
-
helpers_1.Logger.error('Email verification: invalid email', { contact, email });
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
if ((0, emails_js_1.isBlacklistedEmail)(email)) {
|
|
14
|
-
helpers_1.Logger.error('Email verification: blacklisted email', { contact, email });
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
if ((0, emails_js_1.isDisposableEmail)(email)) {
|
|
18
|
-
helpers_1.Logger.error('Email verification: disposable email', { contact, email });
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
if ((0, emails_js_1.isYahooEmail)(email) && !forceVerify) {
|
|
22
|
-
helpers_1.Logger.info('Email verification: risky Yahoo email — skipping Emailable', { contact, email });
|
|
23
|
-
return { state: at_tracking_event_types_1.EMAIL_STATUS.RISKY, email, reason: 'Yahoo email - riskier than other emails' };
|
|
24
|
-
}
|
|
25
|
-
const response = await emailVerificationService.getEmailVerificationWithCaching(email);
|
|
26
|
-
if (!response?.emailVerification) {
|
|
27
|
-
helpers_1.Logger.error('Email verification: no response from verification service', { contact, email, response });
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
helpers_1.Logger.info('Email verification: result', { contact, email, emailVerification: response.emailVerification });
|
|
31
|
-
return response.emailVerification;
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
helpers_1.Logger.error('Email verification: failed to verify contact email', { error, email });
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
exports.verifyContactEmail = verifyContactEmail;
|
|
39
|
-
const verifyContactsEmail = async (contacts, emailVerificationService) => {
|
|
40
|
-
try {
|
|
41
|
-
const verifiedContacts = [];
|
|
42
|
-
for (const contact of contacts) {
|
|
43
|
-
const email = contact.emailAddress;
|
|
44
|
-
if (!email) {
|
|
45
|
-
helpers_1.Logger.warn('Email verification: no email on contact — skipping', { contact });
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
const emailVerification = await (0, exports.verifyContactEmail)(contact, email, emailVerificationService);
|
|
49
|
-
if (emailVerification) {
|
|
50
|
-
verifiedContacts.push({ ...contact, emailVerification });
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return verifiedContacts;
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
helpers_1.Logger.error('Email verification: failed to verify contact emails', { error });
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
exports.verifyContactsEmail = verifyContactsEmail;
|
|
61
|
-
//# sourceMappingURL=contact-email-verifier.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contact-email-verifier.js","sourceRoot":"","sources":["../../../../src/services/email-verification/contact-email-verifier.ts"],"names":[],"mappings":";;;AAAA,iFAAoH;AAEpH,2CAAuC;AACvC,oDAA0G;AAInG,MAAM,kBAAkB,GAAG,KAAK,EACrC,OAA0B,EAC1B,KAAa,EACb,wBAAkD,EAClD,WAAW,GAAG,KAAK,EAC2B,EAAE;IAChD,IAAI;QACF,IAAI,CAAC,IAAA,yBAAa,EAAC,KAAK,CAAC,EAAE;YACzB,gBAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACtE,OAAO,IAAI,CAAC;SACb;QACD,IAAI,IAAA,8BAAkB,EAAC,KAAK,CAAC,EAAE;YAC7B,gBAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC;SACb;QACD,IAAI,IAAA,6BAAiB,EAAC,KAAK,CAAC,EAAE;YAC5B,gBAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;SACb;QACD,IAAI,IAAA,wBAAY,EAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE;YACvC,gBAAM,CAAC,IAAI,CAAC,4DAA4D,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9F,OAAO,EAAE,KAAK,EAAE,sCAAY,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,yCAAyC,EAAkC,CAAC;SAChI;QAED,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC;QACvF,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE;YAChC,gBAAM,CAAC,KAAK,CAAC,2DAA2D,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxG,OAAO,IAAI,CAAC;SACb;QACD,gBAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC7G,OAAO,QAAQ,CAAC,iBAAiB,CAAC;KACnC;IAAC,OAAO,KAAK,EAAE;QACd,gBAAM,CAAC,KAAK,CAAC,oDAAoD,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;KACb;AACH,CAAC,CAAC;AAnCW,QAAA,kBAAkB,sBAmC7B;AAGK,MAAM,mBAAmB,GAAG,KAAK,EACtC,QAA6B,EAC7B,wBAAkD,EACb,EAAE;IACvC,IAAI;QACF,MAAM,gBAAgB,GAAwB,EAAE,CAAC;QACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;YACnC,IAAI,CAAC,KAAK,EAAE;gBACV,gBAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/E,SAAS;aACV;YACD,MAAM,iBAAiB,GAAG,MAAM,IAAA,0BAAkB,EAAC,OAAO,EAAE,KAAK,EAAE,wBAAwB,CAAC,CAAC;YAC7F,IAAI,iBAAiB,EAAE;gBACrB,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;aAC1D;SACF;QACD,OAAO,gBAAgB,CAAC;KACzB;IAAC,OAAO,KAAK,EAAE;QACd,gBAAM,CAAC,KAAK,CAAC,qDAAqD,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;KACb;AACH,CAAC,CAAC;AAtBW,QAAA,mBAAmB,uBAsB9B"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { CONTACT_ACQUISITION_SOURCE, CONTACT_SOURCE_ID, EMAIL_STATUS } from '@adtrackify/at-tracking-event-types';
|
|
2
|
-
import { isBlacklistedEmail } from '../../../libs/emails';
|
|
3
|
-
import { verifyContactEmail, verifyContactsEmail } from '../../../services/email-verification/contact-email-verifier';
|
|
4
|
-
const createTestContact = (emailAddress, id = 'c1') => ({
|
|
5
|
-
id,
|
|
6
|
-
source: CONTACT_ACQUISITION_SOURCE.BDEX,
|
|
7
|
-
sourceId: CONTACT_SOURCE_ID.BDEX,
|
|
8
|
-
firstName: 'John',
|
|
9
|
-
lastName: 'Doe',
|
|
10
|
-
emailAddress,
|
|
11
|
-
emailStatus: EMAIL_STATUS.DELIVERABLE,
|
|
12
|
-
pixelId: 'px',
|
|
13
|
-
identityId: 'id',
|
|
14
|
-
sessionId: 'sess',
|
|
15
|
-
createdAt: '1',
|
|
16
|
-
updatedAt: '1',
|
|
17
|
-
});
|
|
18
|
-
const buildService = (impl) => ({ getEmailVerificationWithCaching: impl ?? jest.fn() });
|
|
19
|
-
describe('isBlacklistedEmail', () => {
|
|
20
|
-
it('flags blacklisted domains and passes clean ones', () => {
|
|
21
|
-
expect(isBlacklistedEmail('a@consolidated.net')).toBe(true);
|
|
22
|
-
expect(isBlacklistedEmail('a@mailinator.com')).toBe(true);
|
|
23
|
-
expect(isBlacklistedEmail('a@example.com')).toBe(false);
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
describe('verifyContactEmail', () => {
|
|
27
|
-
it('returns null for an invalid email and never calls the service', async () => {
|
|
28
|
-
const verify = jest.fn();
|
|
29
|
-
const result = await verifyContactEmail(createTestContact('not-an-email'), 'not-an-email', buildService(verify));
|
|
30
|
-
expect(result).toBeNull();
|
|
31
|
-
expect(verify).not.toHaveBeenCalled();
|
|
32
|
-
});
|
|
33
|
-
it('returns null for a blacklisted email and never calls the service', async () => {
|
|
34
|
-
const verify = jest.fn();
|
|
35
|
-
const result = await verifyContactEmail(createTestContact('a@consolidated.net'), 'a@consolidated.net', buildService(verify));
|
|
36
|
-
expect(result).toBeNull();
|
|
37
|
-
expect(verify).not.toHaveBeenCalled();
|
|
38
|
-
});
|
|
39
|
-
it('short-circuits a risky Yahoo email to RISKY without calling the service', async () => {
|
|
40
|
-
const verify = jest.fn();
|
|
41
|
-
const result = await verifyContactEmail(createTestContact('a@yahoo.com'), 'a@yahoo.com', buildService(verify));
|
|
42
|
-
expect(result?.state).toBe(EMAIL_STATUS.RISKY);
|
|
43
|
-
expect(verify).not.toHaveBeenCalled();
|
|
44
|
-
});
|
|
45
|
-
it('verifies a Yahoo email via the service when forceVerify is true', async () => {
|
|
46
|
-
const verify = jest.fn().mockResolvedValue({ emailVerification: { state: EMAIL_STATUS.DELIVERABLE, email: 'a@yahoo.com' } });
|
|
47
|
-
const result = await verifyContactEmail(createTestContact('a@yahoo.com'), 'a@yahoo.com', buildService(verify), true);
|
|
48
|
-
expect(verify).toHaveBeenCalledWith('a@yahoo.com');
|
|
49
|
-
expect(result?.state).toBe(EMAIL_STATUS.DELIVERABLE);
|
|
50
|
-
});
|
|
51
|
-
it('returns the verification result for a clean email', async () => {
|
|
52
|
-
const verify = jest.fn().mockResolvedValue({ emailVerification: { state: EMAIL_STATUS.DELIVERABLE, email: 'good@example.com' } });
|
|
53
|
-
const result = await verifyContactEmail(createTestContact('good@example.com'), 'good@example.com', buildService(verify));
|
|
54
|
-
expect(verify).toHaveBeenCalledWith('good@example.com');
|
|
55
|
-
expect(result?.state).toBe(EMAIL_STATUS.DELIVERABLE);
|
|
56
|
-
});
|
|
57
|
-
it('returns null when the service yields no verification', async () => {
|
|
58
|
-
const verify = jest.fn().mockResolvedValue(undefined);
|
|
59
|
-
const result = await verifyContactEmail(createTestContact('good@example.com'), 'good@example.com', buildService(verify));
|
|
60
|
-
expect(result).toBeNull();
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
describe('verifyContactsEmail', () => {
|
|
64
|
-
it('keeps verified contacts, drops failures + no-email, and does not mutate the input', async () => {
|
|
65
|
-
const verify = jest.fn(async (email) => email === 'good@example.com' ? { emailVerification: { state: EMAIL_STATUS.DELIVERABLE, email } } : undefined);
|
|
66
|
-
const good = createTestContact('good@example.com', 'good');
|
|
67
|
-
const contacts = [good, createTestContact('not-an-email', 'bad'), createTestContact(undefined, 'noemail')];
|
|
68
|
-
const result = await verifyContactsEmail(contacts, buildService(verify));
|
|
69
|
-
expect(result).toHaveLength(1);
|
|
70
|
-
expect(result?.[0].id).toBe('good');
|
|
71
|
-
expect(result?.[0].emailVerification?.state).toBe(EMAIL_STATUS.DELIVERABLE);
|
|
72
|
-
expect(good.emailVerification).toBeUndefined();
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
//# sourceMappingURL=contact-email-verifier.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contact-email-verifier.spec.js","sourceRoot":"","sources":["../../../../../src/__tests__/services/email-verification/contact-email-verifier.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { EmailableVerifyEmailResponse, ThirdPartyContact } from '@adtrackify/at-tracking-event-types';
|
|
2
|
-
import type { EmailVerificationService } from './email-verification-service.js';
|
|
3
|
-
export declare const verifyContactEmail: (contact: ThirdPartyContact, email: string, emailVerificationService: EmailVerificationService, forceVerify?: boolean) => Promise<EmailableVerifyEmailResponse | null>;
|
|
4
|
-
export declare const verifyContactsEmail: (contacts: ThirdPartyContact[], emailVerificationService: EmailVerificationService) => Promise<ThirdPartyContact[] | null>;
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { EMAIL_STATUS } from '@adtrackify/at-tracking-event-types';
|
|
2
|
-
import { Logger } from '../../helpers';
|
|
3
|
-
import { isBlacklistedEmail, isDisposableEmail, isYahooEmail, validateEmail } from '../../libs/emails.js';
|
|
4
|
-
export const verifyContactEmail = async (contact, email, emailVerificationService, forceVerify = false) => {
|
|
5
|
-
try {
|
|
6
|
-
if (!validateEmail(email)) {
|
|
7
|
-
Logger.error('Email verification: invalid email', { contact, email });
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
if (isBlacklistedEmail(email)) {
|
|
11
|
-
Logger.error('Email verification: blacklisted email', { contact, email });
|
|
12
|
-
return null;
|
|
13
|
-
}
|
|
14
|
-
if (isDisposableEmail(email)) {
|
|
15
|
-
Logger.error('Email verification: disposable email', { contact, email });
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
if (isYahooEmail(email) && !forceVerify) {
|
|
19
|
-
Logger.info('Email verification: risky Yahoo email — skipping Emailable', { contact, email });
|
|
20
|
-
return { state: EMAIL_STATUS.RISKY, email, reason: 'Yahoo email - riskier than other emails' };
|
|
21
|
-
}
|
|
22
|
-
const response = await emailVerificationService.getEmailVerificationWithCaching(email);
|
|
23
|
-
if (!response?.emailVerification) {
|
|
24
|
-
Logger.error('Email verification: no response from verification service', { contact, email, response });
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
Logger.info('Email verification: result', { contact, email, emailVerification: response.emailVerification });
|
|
28
|
-
return response.emailVerification;
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
Logger.error('Email verification: failed to verify contact email', { error, email });
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
export const verifyContactsEmail = async (contacts, emailVerificationService) => {
|
|
36
|
-
try {
|
|
37
|
-
const verifiedContacts = [];
|
|
38
|
-
for (const contact of contacts) {
|
|
39
|
-
const email = contact.emailAddress;
|
|
40
|
-
if (!email) {
|
|
41
|
-
Logger.warn('Email verification: no email on contact — skipping', { contact });
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
const emailVerification = await verifyContactEmail(contact, email, emailVerificationService);
|
|
45
|
-
if (emailVerification) {
|
|
46
|
-
verifiedContacts.push({ ...contact, emailVerification });
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return verifiedContacts;
|
|
50
|
-
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
Logger.error('Email verification: failed to verify contact emails', { error });
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
//# sourceMappingURL=contact-email-verifier.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contact-email-verifier.js","sourceRoot":"","sources":["../../../../src/services/email-verification/contact-email-verifier.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|